Um Daten in ein initialisiertes Datensegment zu erzwingen, wenn es unter OS X und Linux (aber nicht unter GNU Hurd) verfügbar ist, führen Sie die folgenden Schritte aus. Beachten Sie, dass diese Technik plattformspezifisch ist, aber auf der Seite die C/C++ - Einschränkungen für Sichtbarkeits- und Speicherklassen enthält.
#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;
Ich bin immer noch wo Die Versionsnummern des Compilers können daher nicht so genau sein, wie sie sein könnten. Sie haben OK unter LLVM Clang, Apple Clang, GCC und MacPorts GCC getestet. Aber ich vermute, dass Clang in der Lage sein wird, nach unten zu gehen, und GCC muss möglicherweise nach oben gehen.
Auch eine [MCVE] (http://stackoverflow.com/help/mcve), die die Valgrind-Nachricht –
gibt, könnte ein legitimer Fehler in Ihrem Code sein. –
statische Initialisierung Reihenfolge wäre kein Problem - alle statischen Variablen sind Null initialisiert, bevor eine dynamische Initialisierung auftritt –