2016-07-13 12 views
-2

Ich habe eine bool geben Sie eine CPP-Quelldatei ein. Die Variable kann nicht statisch gemacht werden. Ich möchte die Variable in einem initialisierten Datensegment platzieren.Variable in Quelldatei in initialisiertes Datensegment unter OS X erzwingen?

Nach dem OS X ABI Mach-O File Format Reference, glaube ich, der Ort, wo ich die Variable wollen, ist residieren __DATA,__data aus Tabelle 2

Wie kann ich eine Variable erzwingen eine initialisierte Datensegment unter OS X mit Apple-Compiler?

Ich realisiere, dass ich wahrscheinlich etwas plattformspezifisch verwenden muss. Ich merke auch, dass es nicht tragbares C++ sein wird.

+0

Auch eine [MCVE] (http://stackoverflow.com/help/mcve), die die Valgrind-Nachricht –

+0

gibt, könnte ein legitimer Fehler in Ihrem Code sein. –

+0

statische Initialisierung Reihenfolge wäre kein Problem - alle statischen Variablen sind Null initialisiert, bevor eine dynamische Initialisierung auftritt –

Antwort

0

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.