Можно ли объявить статическую переменную в #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
};
Как компилятор разрешит статическое const char *, когда я включаю этот заголовочный файл в какой-то другой файл и пытаюсь получить доступ Foo::TEXT[]
,
Можно ли объявить статическую переменную в
#define
Директива?
Да, это возможно.
Как компилятор разрешит статическое const char *, когда я включаю этот заголовочный файл в какой-то другой файл и пытаюсь получить доступ
Foo::TEXT[]
,
Это решается на этапе связывания.
Вы должны выяснить, что происходит на этапах компиляции, которые использует компилятор Си.
Поскольку #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
};