#define指令中的静态变量c ++

时间:2016-10-23 16:27:09

标签: c++ static-variables compiler-directives

是否可以在#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
   };

当我将此头文件包含在其他文件中并尝试访问Foo::TEXT[]时,编译器将如何解析静态const char *。

2 个答案:

答案 0 :(得分:1)

  

是否可以在#define指令中声明静态变量?

是的,这是可能的。

  

当我将此头文件包含在其他文件中并尝试访问Foo::TEXT[]时,编译器将如何解析静态const char *。

它已在链接阶段得到解决。

答案 1 :(得分:1)

你必须弄清楚C编译器使用的编译阶段会发生什么。

由于#define是一个预编译器指令,所以在实际编译或查看代码之前,所有内容都将被解析。将根据指令传递或过滤文本片段(代码,函数,包括的任何内容)。

所有其他的事情发生在那之后,就像编译一样,它将寻找全局变量声明和链接,它将寻找那些变量的地址。

在这种情况下,如果您使用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
   };