我遇到了与C和C ++之间的函数定义/声明相关的以下差异。
在C ++中,如果我在声明和定义它之前调用一个函数,我会得到错误消息“函数名称是无效的标识符”,这对我来说很好,因为这听起来很合理。
在C中使用Visual Studio编译器编译以下程序时,我收到错误消息:
error C2371: 'fun' : redefinition; different basic types
并在gcc-4.3.4中成功执行了此警告:
warning: conflicting types for ‘fun’
这是程序:
#include <stdio.h>
int main(){
fun();
return 0;
}
void fun(){
printf("It is fun");
}
在C中调用一个函数然后为定义它而烦恼是不是很好?!为什么编译器的行为不同?
答案 0 :(得分:2)
您必须先声明该功能。如果未声明,则默认情况下该函数应返回int
并且可以接受任意数量的参数。
答案 1 :(得分:2)
当您在C89中调用没有原型的函数时(免责声明:我不知道C99),您隐含地将其声明为
int fun();
请注意,在C中,除了在C ++中,空的parantheses只是意味着你没有指定它所采用的参数,而不是它需要零参数。
当您将该函数重新声明为返回void时,您会收到警告,但没有错误。如果你返回一些非平凡的东西(结构,浮点数,......)而不是void,或者你试图使用函数的int结果,那么你可能在运行时遇到了很大的麻烦。
答案 2 :(得分:1)
C支持'implicit int'返回类型,即fun();
将被视为函数fun
的声明,不带参数并返回int。这是因为你之前没有声明过这个函数。
在C ++中,情况并非如此,其中您的代码格式不正确。
答案 3 :(得分:1)
当函数没有参数并且返回int
时,这只能在C中可靠地工作所以是的,它是可移植的,但是非常糟糕的做法 - here's a very good example explaining why。
答案 4 :(得分:1)
您的代码对于C ++(正如其他人已经说过的那样)以及C99也是无效的。它们都不允许隐式声明函数。
没有太多理由允许这样的事情,维护包含您使用的函数原型的头文件并不是很困难。
答案 5 :(得分:0)
问题是fun()
的声明及其实现的返回类型不同:
fun() /* int return type assumed */
/* ... */
void fun() { /* ... */ } /* void "return type" */
然而,在标准的C ++ ISO 98中,有人声称编译器不应该再为缺少的类型假设int类型(不确定C'99,而你发布C和C ++的问题)。
最后,在main()
内声明一个函数是可能的,但不是一个好的常规做法,除非函数fun()
不应该为程序的其余部分所知。