【发布时间】:2017-02-04 00:38:04
【问题描述】:
C 中是否有任何方法可以定义 一个符号,以便链接器合并所有相同的定义?这在链接器级别似乎是可能的,例如,C++ 支持模板函数和模板静态变量,它们正是这样做的1。
具体来说,假设我想在头文件int_array.h 中定义一个像这样的int array[]:
int array[42] = {};
当许多单独的编译单元都包含int_array.h时,它们对应的.o文件显然会包含array的定义和空间-但是当它们链接在一起时,我希望只有一个array符号存在每个人都指向它。
答案不一定是标准C(事实上,标准并没有真正明确地解决链接器)——但它应该普遍适用于现代编译器。
1这是一个 C 问题,而不是 C++ 问题,但事实证明每个现代工具链都使用相同的链接器。
【问题讨论】:
-
只要所有声明都相同,您可以随意多次声明您的符号。您似乎在问是否可以多次定义它(通过初始化它),在这种情况下,AFAIK,不,您不能。
-
@IanMiller - 完全正确。在问我的问题时,我尽量小心使用 declare 而不是 define ,显然我的注意力范围几乎是问题标题,仅此而已。现在应该修好了。
-
如果您在标头中定义数组并将标头包含在多个文件中,链接器不会抱怨,该数组被定义了多次吗?