c++ - 除非有提示,否则我的项目如何不提示 Unresolved 独立性?

标签 c++

我有以下代码:

#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/

相关文章:

c++ - 如何覆盖 std::filebuf?

c++ 无法解释的类 “has not been declared” 由于命名空间导致的错误

c++ - 我怎样才能让我的代码随机打印一个字符或字符串?

c++ - 如何从 std::vector of real double 填充 std::vector of complex double

C++ : initialize(new) an array of vector of different initial size

c++ - %s 的 printf() 的不同运行时检查?

java - 无序(或哈希)映射中的迭代器

c++ - 如何在程序中包含 Direct3D?

c++ - 在 ubuntu 中使用 cuda 支持构建 opencv 3.1.0 的问题

C++ std::pair, std::vector 和 memcpy