强制源文件中的变量进入 OS X 上的初始化数据段?

Force variable in source file into initialized data segment on OS X?

我在 CPP 源文件中有一个 bool 类型。变量 不能 设为静态。我想把变量放在一个初始化的数据段中。

根据 OS X ABI Mach-O File Format Reference,我相信我希望变量驻留的位置是 Table 2.

中的 __DATA,__data

如何使用 Apple 编译器在 OS X 上强制变量初始化数据段?

我意识到我可能不得不使用特定于平台的东西。我也意识到它不会是可移植的 C++。

要在 OS X 和 Linux(但不是 GNU Hurd)上可用时强制数据进入初始化数据段,请执行以下操作。请注意,此技术是特定于平台的,但它避开了 C/C++ 可见性和存储方面的限制 类。

#if defined(__clang__ ) && !defined(__apple_build_version__)
   #define LLVM_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__clang__ ) && defined(__apple_build_version__)
   #define APPLE_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#elif defined(__GNUC__)
   #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
...


#if ((__MACH__ >= 1) && ((LLVM_CLANG_VERSION >= 30600) || (APPLE_CLANG_VERSION >= 70100) || (GCC_VERSION >= 40300)))
   #define INIT_SECTION __attribute__((section ("__DATA,__data")))
#elif ((__ELF__ >= 1) && (GCC_VERSION >= 40300))
   #define INIT_SECTION __attribute__((section ("nocommon")))
#else
   #define INIT_SECTION
#endif

foo.h:

extern bool g_x;
extern bool g_y;

foo.cpp:

bool INIT_SECTION g_x, INIT_SECTION g_y;

我仍在处理编译器版本号,因此它们可能不会尽可能准确。他们在 LLVM Clang、Apple Clang、GCC 和 MacPorts GCC 下测试正常。但是我怀疑Clang可以向下移动,而GCC可能需要向上移动。