在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()
不应该为程序的其余部分所知。