C++ 为什么下面的程序要编译? #包括 使用名称空间std; int main() { int abc(); 返回0; }

C++ 为什么下面的程序要编译? #包括 使用名称空间std; int main() { int abc(); 返回0; },c++,C++,当编译器到达intabc()行时,它正确地认为我们正在声明一个名为abc的函数,该函数不带任何参数,返回类型为int。那么为什么编译器不会因为我没有定义一个名为abc的函数而向我抛出一个错误呢?在没有定义函数的情况下声明函数不是一个错误。该函数可能已在另一个文件中定义。在C++中,每个编译单元(C++文件)被单独编译,并在一起链接。 链接器也不会显示错误,因为您没有尝试使用该函数。如果您试图使用它,链接器将在所有编译单元中搜索该定义,并且在未找到定义时显示错误。我认为您假定代码行是 #inclu

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

在没有定义函数的情况下声明函数不是一个错误。该函数可能已在另一个文件中定义。在C++中,每个编译单元(C++文件)被单独编译,并在一起链接。
链接器也不会显示错误,因为您没有尝试使用该函数。如果您试图使用它,链接器将在所有编译单元中搜索该定义,并且在未找到定义时显示错误。

我认为您假定代码行是

#include<iostream>

using namespace std;

int main()
{
    int abc();
    return 0;
}
这将是对函数的调用。(请注意,这也可能“编译”,但不会链接。)

无论您如何编写原型,它都不是对函数的调用

int a = abc();

您没有调用该函数,只是说它存在。编译器对此没有问题,因为您没有调用函数。声明和不使用它们是不被禁止的。为什么编译器会报告错误?代码仅将符号
abc
声明为函数。它不使用它,因此编译器不需要比它已有的更多关于
abc
的信息。您甚至可以调用该函数,编译器将很乐意编译该文件。如果你打电话给它,链接器会抱怨
abc
的定义不可用。
int abc();