手动创建gnu_unique_object符号

时间:2016-04-27 09:00:49

标签: c++ gcc gnu ld nm

考虑在标题中定义的类成员函数的情况,其中包含static存储变量。当您在多个编译单元中包含标头时,最终会得到static变量的多个副本。但是,the compiler will fix this for you,只需选择一个发出的变量(请注意,这与内联不同)。这是通过对符号的可能类型的GNU特定扩展来实现的,正好gnu_unique_object(它们显示为" u"在nm中,它们在手册页中调用它们& #34;唯一的全局符号")。

问题是,如何强制编译器为任意变量生成这种符号?我厌倦了在课堂上包装东西以获得这种行为。

2 个答案:

答案 0 :(得分:0)

如果在头文件中声明全局变量,那么您将在每个编译单元中获得该变量的不同实例。 extern关键字就是你所追求的。此关键字使实例化成为前向声明。它可以被认为是一个承诺,即该名称的变量在不同的编译单元中实例化,并且在链接时可以找到。

MyTrueGlobals.h

extern int global_variable_1;

MyTrueGlobals.cpp

int global_variable_1 = 0;

答案 1 :(得分:0)

从 C++ 17 开始,可以使用内联变量。它们产生 gnu_unique_object 符号:

$ cat c1.cpp
inline int var1 = 123;

void f1() {
    int x = var1;
}
$ g++ -std=c++1z -c c1.cpp
$ nm -C c1.o
0000000000000000 T f1()
0000000000000000 u var1