我有以下代码:
#include <iostream>
extern "C" int calcSum_(int a, int b, int c);
int main()
{
printf("Hello World");
return 1;
}
为什么以下代码构建时我的项目中没有其他源文件且其中包含 calcSum_ 函数?当我尝试执行以下操作时,它确实会提示:
int result = calcSum_(1,2,3);
构建不涉及创建一个可以运行的可执行文件吗?这不涉及链接吗?怎样才能不出错地构建呢?为什么我需要向链接器“突出显示”该函数缺失?
最佳答案
传统上来说,链接器的工作水平相当低。对象文件包含导出符号的列表(及其地址)和缺失符号的列表(以及必须在代码内替换已解析地址的地址)。链接器必须将它们全部放在一起,找到其他目标文件中丢失的符号并进行替换。
现在,如果编译器看到函数原型(prototype)但未使用它,则该信息不会传递给链接器 - 目标文件不需要该符号,无需进行替换 - 因此链接器有无法知道某个函数已声明但未定义。
顺便说一句,这种行为在一些 C++03 习惯用法中被积极利用 - 特别是“禁用复制构造函数”;您声明了复制构造函数以禁用自动生成的复制构造函数,但您没有实现它,因此如果有人意外尝试使用它,则会发出链接错误。
关于c++ - 除非有提示,否则我的项目如何不提示 Unresolved 独立性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734248/