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

时间:2011-12-14 10:19:46

标签: c++ c

我遇到了与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中调用一个函数然后为定义它而烦恼是不是很好?!为什么编译器的行为不同?

6 个答案:

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

相关问题