【发布时间】:2018-08-07 16:23:58
【问题描述】:
我有两个源文件,其中一个有一个来自我自己的类的静态成员 foo。当我将其编译为目标文件时,编译器会生成一个 .ctors 部分,并在其中生成一个调用构造函数的函数,我们将其称为 _GLOBAL__SUB_I_FOO。
在第二个源文件中,我尝试自己调用这个构造函数:
int _GLOBAL__SUB_I_FOO();
int bar(){
_GLOBAL__SUB_I_FOO();
}
当我链接这两个对象时,第二个文件中存在对 _GLOBAL__SUB_I_FOO 的未定义引用。 当我使用 --relocatable 链接查看出了什么问题时,我可以看到原始构造函数已重命名为 _GLOBAL__SUB_I_FOO_0 以避免“碰撞”(这是故意的)。我能做些什么来修复它? 我正在使用 gcc 7.3.0
【问题讨论】:
-
为什么不直接调用构造函数(创建对象)?
-
是静态对象的构造函数
-
是编译器创建了这个函数
_GLOBAL__SIB_I_FOO还是你写的函数? -
你为什么还要调用这个函数?在我看来,它应该作为实现细节保持隐藏。
-
鉴于函数的名称是为实现保留的名称,很明显您不应该自己调用它(即使 if i> 你在技术上可以)。