#define 指令中的静态变量 C++
static variable in #define directive c++
是否可以在 #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[]
时,编译器将如何解析 static const char *。
Is it possible to declare static variable in a #define
directive?
是的,有可能。
How compiler will resolve static const char *, when I include this header file in some other file and try to access Foo::TEXT[]
.
已在链接阶段解决。
您必须弄清楚 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
};
是否可以在 #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[]
时,编译器将如何解析 static const char *。
Is it possible to declare static variable in a
#define
directive?
是的,有可能。
How compiler will resolve static const char *, when I include this header file in some other file and try to access
Foo::TEXT[]
.
已在链接阶段解决。
您必须弄清楚 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
};