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();