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