【发布时间】:2017-01-27 10:12:13
【问题描述】:
我想在全局范围内执行一些代码。所以,我可以像这样在编译单元中使用全局变量:
int execute_global_code();
namespace {
int dummy = execute_global_code();
}
问题是,如果这个编译单元最终在一个静态库中(或与-fvisibility=hidden 共享的库),链接器可能会决定删除dummy,因为它没有被使用,而我的全局代码执行。
所以,我知道我可以根据特定的上下文使用具体的解决方案:特定的编译器(pragma include)、编译单元位置(属性可见性默认值)、周围的代码(比如说,在我的代码)。
问题是,是否有一种标准方法可以确保execute_global_code 将被执行,该方法可以适合单个宏,无论编译单元放置(可执行文件还是lib)都可以工作?即:只有标准 c++,并且在该宏之外没有用户代码(就像在 main() 中虚拟使用 dummy)
【问题讨论】:
-
在您的描述中,您已经排除了解决问题的各种方法的可能性。为什么你坚持初始化
dummy的代码必须适合单个宏? -
@Peter 因为否则“在 main 中虚拟使用
dummy”将是解决方案。关键是我不想用显式初始化代码给库用户增加负担。 -
@grek40 这是一个特定于编译器的解决方案。这是我可能需要使用的东西,但我希望找到一个标准的 C++ 解决方案(如果存在),而不必
#if-检查各种编译器或将各种编译器设置强加给库用户 -
加上@grek40 所说的内容,听起来好像Schwartz/Nifty Counter 可能就是您正在寻找的东西。
标签: c++