【发布时间】:2017-11-25 19:01:48
【问题描述】:
假设我有一个人为的头文件,其中包含一个模板类和两个包含完全相同的模板类实例化的源文件,以及一个重复的函数。那就是……
人为的头文件(thing.hpp):
#pragma once
template <typename T>
class Thing {
public:
T t;
public:
T& value() {
return t;
}
};
thing.cpp:
#include <thing.hpp>
template class Thing<int>;
int MeaningOfLife() {
return 42;
}
thingy.cpp:(和thing.cpp一模一样)
在编译和链接时(在 OS X 上使用 clang),似乎只有 MeaningOfLife 被视为重复符号,但模板实例化的符号(只是 Thing::value())不是。仔细检查反汇编后,似乎在Thing::value() 的符号上放置了一个汇编指令,称为.weak_definition。
问题 0:暗示该指令正在做一些事情来防止符号被多重定义,但它到底在做什么?
问题 1:其他编译器如何在其他地方(例如 Linux、Windows 等)完成此操作?
问题 2:如果我错误地更改了其中一个重复模板实例的汇编代码会怎样?即相同的符号,不同的功能体。智能编译器会检测到差异吗?
【问题讨论】:
-
我相信您的所有问题都在this 线程中得到了解答。