c++ - 如何用头文件确定函数定义?

标签 c++ compilation header-files

在 C++ 中使用单独的文件时,我知道可以使用这样的头文件来声明函数:

// MyHeader.h

int add(int num, int num2);

// MySource.cpp

int add(int num, int num2) {
    return num + num2;
}

// Main.cpp

#include "MyHeader.h"
#include <iostream>

int main() {
    std::cout << add(4, 5) << std::endl;
    return 0;
}

我的问题是,在这种情况下,当 MyHeader.h 和 Main.cpp 根本没有对 MySource.cpp 的引用时,编译器如何确定 add(int,int) 的函数定义?

例如,如果程序中有多个 add 函数(具有相同的参数),我如何确保在特定情况下使用了正确的函数?

最佳答案

函数声明为编译器提供了足够的信息来生成对该函数的调用。

然后,编译器生成一个目标文件,指定该目标文件所引用的外部函数的名称(在 C++ 的情况下,这些名称被破坏以指定参数、命名空间、cv 限定符等)(连同它定义的另一个名称列表)。

链接器然后获取所有这些目标文件,并尝试将某物引用但未定义的每个名称与定义相同名称的其他目标文件进行匹配。然后它分配并填充地址,因此在一个目标文件引用 nameX 的地方,它填充它从另一个文件分配给 nameX 的地址。

至少在典型情况下,它查看的目标文件将包含许多库(标准库 + 您指定的任何其他库)。一个库基本上只是目标文件的集合,它们一起被推到一个文件中,有足够的数据来索引哪些数据是哪个目标文件。在少数情况下,它还包括一些额外的元数据,以(例如)快速找到定义特定名称的目标文件(显然为了更快的链接很方便,但并不是绝对必要)。

如果有两个或更多函数具有完全相同的错位名称,那么您的代码具有未定义的行为(您违反了一个定义规则)。链接器通常会给出一条错误消息,告诉您在目标文件 A 和目标文件 B 中都定义了 nameZ(但 C++ 标准并不真正要求这样做)。

关于c++ - 如何用头文件确定函数定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941116/

相关文章:

c++ - 在Windows中运行PBC-Visual Studio

Java静态方法变量在编译时解析,在运行时加载?

c++ - 链接 .lib 文件时出现 VC12 命令行错误

c++ - 将声明和实现压缩到一个 HPP 文件中

c++ - SDL_TTF header 给我带来麻烦

c++ - bitset 是否保证连续性?

C++ 入门第 5 版。 union 和类类型的成员

c++ - 将方法传递给包含对象指针的集合的所有元素,C++

Java - 什么时候是编译器错误,什么时候是运行时异常?

c - 为配置宏提供默认值