статическая переменная в директиве #define Переполнение стека

Можно ли объявить статическую переменную в #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[],

0

Решение

Можно ли объявить статическую переменную в #define Директива?

Да, это возможно.

Как компилятор разрешит статическое const char *, когда я включаю этот заголовочный файл в какой-то другой файл и пытаюсь получить доступ Foo::TEXT[],

Это решается на этапе связывания.

1

Другие решения

Вы должны выяснить, что происходит на этапах компиляции, которые использует компилятор Си.

Поскольку #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
};
1

По вопросам рекламы [email protected]