为什么以下程序会编译?

时间:2018-06-21 10:09:13

标签: c++

#include<iostream>

using namespace std;

int main()
{
    int abc();
    return 0;
}

当编译器到达行int abc();时,它正确地认为我们在声明一个名为abc的函数,该函数不接受任何参数,返回类型为int类型。那么,为什么编译器没有因为我没有定义名为abc的函数而向我抛出错误?

2 个答案:

答案 0 :(得分:11)

不定义函数就声明它不是错误。该功能可能已在另一个文件中定义。在C ++中,每个编译单元(C ++文件)都单独编译,然后再链接在一起。

链接器也不显示错误,因为您没有尝试使用该功能。如果您尝试使用它,则链接器将在所有编译单元中搜索该定义,并在找不到定义时显示错误。

答案 1 :(得分:1)

我认为您假设代码行是...

int a = abc();

这将是对该函数的调用。 (请注意,这也可能会“编译”但不会链接。)

无论您写了什么原型,它都不是对函数的调用。

int abc();