【问题标题】:Defining a symbol in a header whose repeated instances will be merged by the linker在标头中定义一个符号,其重复实例将由链接器合并
【发布时间】: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 ,显然我的注意力范围几乎是问题标题,仅此而已。现在应该修好了。
  • 如果您在标头中定义数组并将标头包含在多个文件中,链接器不会抱怨,该数组被定义了多次吗?

标签: c linker


【解决方案1】:

只需将它们声明为弱:

__attribute__((weak)) int array[42] = {};

有关更多信息,请参阅例如here.

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多