2016-10-23 5 views
0

Ist es möglich, eine statische Variable in einer #define Direktive zu deklarieren?statische Variable in #define Direktive C++

// header file 
    #define TEXT_ENUM 
    #ifdef TEXT_ENUM 
     #define TEXT_HANDLING_MACRO \ 
      static const char * TEXT[]; \ 
      static const char * getText(int _enum) { \ 
       return TEXT[_enum]; \ 
      } 
    #else 
     #define TEXT_HANDLING_MACRO 
    #endif 

    struct Foo { 
     TEXT_HANDLING_MACRO 
    }; 

    // cpp file 
    #include "foo.h" 

    const char * Foo::TEXT[] = { 
     "ONE", 
     "TWO", 
     "THREE", 
     0 
    }; 

Wie Compiler static const char * auflösen wird, wenn ich diese Header-Datei in einer anderen Datei enthalten und versuchen, den Zugang Foo::TEXT[].

+0

Meinen Sie 'Foo :: TEXT [] '? Es sollte dann funktionieren. –

+0

Ich bekomme einen undefinierten Verweis auf 'Packet :: TEXT 'Fehler. – has

+2

@has: Das bedeutet, dass Ihre '.cpp' Datei fehlt. In dem, was Sie oben angegeben haben, ist 'Packet :: TEXT' perfekt definiert. – AnT

Antwort

1

Ist es möglich, eine statische Variable in einer #define Direktive zu deklarieren?

Ja, es ist möglich.

Wie der Compiler statische const char * auflöst, wenn ich diese Header-Datei in eine andere Datei einfüge und versuche, auf Foo::TEXT[] zuzugreifen.

Es ist in der Verknüpfungsstufe gelöst.

+0

Wenn ich 'TEXT_ENUM' in einer anderen Datei definieren und aus dieser 'foo.h' Datei entfernen, bekomme ich erneut einen Referenzfehler. Wie kann ich dieses Problem beheben? – has

+0

@has Das ist wahrscheinlich eine andere Frage. –

+0

ok Ich werde eine neue Frage stellen. Vielen Dank – has

1

Sie müssen herausfinden, was passiert durch die Stufen der Kompilationen, die der C-Compiler verwendet.

Da #define eine Pre-Compiler-Direktive ist, wird alles aufgelöst, bevor der Code kompiliert oder betrachtet wird. Textteile (Code, Funktionen, was auch immer enthalten ist) werden gemäß der Richtlinie weitergegeben oder gefiltert.

Der ganze Rest passiert danach, wie die Kompilierung, die nach der globalen Variablendeklaration suchen wird, und die Verknüpfung, die nach der Adresse dieser Variable suchen wird.

In Ihrem Fall, wenn Sie Ihre Datei nehmen und kompilieren mit gcc-Compiler und der -E-Option (nur die Precompilers Bühne zu tun), erhalten Sie:

struct Foo { 
     static const char * TEXT[]; static const char * getText(int _enum) { return TEXT[_enum]; } 
    }; 

    const char * Foo::TEXT[] = { 
     "ONE", 
     "TWO", 
     "THREE", 
     0 
    }; 
Verwandte Themen