0

#defineディレクティブで静的変数を宣言することは可能ですか?

    // 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
   };

このヘッダー ファイルを他のファイルにインクルードしてアクセスしようとしたときに、コンパイラが static const char * を解決するFoo::TEXT[]方法

4

2 に答える 2

1

C コンパイラが使用するコンパイルの各段階で何が起こるかを理解する必要があります。

#define si はプリコンパイラ ディレクティブであるため、実際にコードをコンパイルまたは確認する前にすべてが解決されます。テキストの断片 (コード、関数、含まれるもの) は、ディレクティブに従って渡されるか、フィルター処理されます。

その後、グローバル変数宣言を検索するコンパイルや、それらの変数のアドレスを検索するリンクなど、残りのすべてが行われます。

あなたの場合、ファイルを取得して gcc コンパイラと -E オプション (プリコンパイラ ステージのみを実行するため) でコンパイルすると、次のようになります。

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

   const char * Foo::TEXT[] = {
       "ONE",
       "TWO",
       "THREE",
       0
   };
于 2016-10-23T17:05:19.273 に答える