在C中的main中调用它后,是否可以移植来定义和声明该函数?

我遇到了与C和C ++之间的函数定义/声明相关的以下差异。

在C ++中,如果我在声明和定义它之前调用一个函数,我会收到错误消息“函数名称是无效标识符”,这对我来说很好,因为这听起来很合理。

在使用Visual Studio编译器的C中,当我编译以下程序时,我收到错误消息:

error C2371: 'fun' : redefinition; different basic types 

并且在gcc-4.3.4中它仅使用此警告成功执行:

 warning: conflicting types for 'fun' 

这是程序:

 #include  int main(){ fun(); return 0; } void fun(){ printf("It is fun"); } 

因此,只需调用一个函数然后打扰定义它就可以了吗? 为什么编译器的行为不同?

当您在C89中调用没有原型的函数时(免责声明:我不知道C99),您隐含地将其声明为

int fun();

请注意,在C中,除了在C ++中,空的parantheses只是意味着你没有指定它所采用的参数,而不是它需要零参数。

当您将该函数重新声明为返回void时,您会收到警告,但没有错误。 如果你返回一些非平凡的东西(结构,浮点数,……)而不是void,或者如果你试图使用函数的int结果,那么你可能在运行时遇到了很大的麻烦。

您必须先声明该function。 如果未声明,则默认情况下该函数应返回int并且可以使用任意数量的参数。

当函数没有参数并返回int时,这只能在C中可靠地工作所以是的,它是可移植的,但是一个非常糟糕的做法 – 这是解释原因的一个非常好的例子 。

C支持’implicit int’返回类型即fun(); 将被视为函数的声明,不带参数并返回int。 这是因为您之前没有声明过该function。

在C ++中,情况并非如此,其中您的代码格式不正确。

您的代码对于C ++(正如其他人已经说过的)以及C99也是无效的。 它们都不允许隐式声明函数。

没有太多理由允许这样的事情,维护包含您使用的函数原型的头文件并不是很困难。

问题是fun()的声明及其实现在返回类型上有所不同:

 fun() /* int return type assumed */ /* ... */ void fun() { /* ... */ } /* void "return type" */ 

但是,在标准的C ++ ISO 98中,声明编译器不应该再为缺少的类型假定int类型(不确定C’99,而你发布C和C ++的问题)。

最后,在main()声明一个函数是可能的,但不是一个很好的通用实践,除非函数fun()不应该为程序的其余部分所知。