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

当我将此头文件包含在其他文件中并尝试访问Foo::TEXT[].

4

2 回答 2

1

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

是的,有可能。

当我将此头文件包含在其他文件中并尝试访问Foo::TEXT[].

它在链接阶段解决。

于 2016-10-23T16:53:00.473 回答
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 回答