Правильно ли объявлять переменные с помощью макросов в заголовочном файле на C ++? - PullRequest
2 голосов
/ 12 февраля 2011

Я столкнулся с проблемой при объявлении некоторых глобальных переменных с помощью макросов. Вот случай:

оригинальный код:

/* some_config.h */  
static const std::string KEYWORDS_A[] = {"AXX", "AYY"};  
static const std::vector<std::string>  KEYWORDS_A_VEC(KEYWORDS_A, KEYWORDS_A + sizeof(KEYWORDS_A) / sizeof(KEYWORDS_A[0]));  
static const std::string KEYWORDS_B[] = {"BXX", "BYY"};  
static const std::vector<std::string>  KEYWORDS_B_VEC(KEYWORDS_B, KEYWORDS_B + sizeof(KEYWORDS_B) / sizeof(KEYWORDS_B[0])); 

текущий код:

/* some_config.h */  
#define REGISTER_VEC(NAME) \  
static const std::vector<std::string>  KEYWORDS_##NAME_VEC(KEYWORDS_##NAME, KEYWORDS_##NAME + sizeof(KEYWORDS_##NAME) / sizeof(KEYWORDS_##NAME[0]))  
static const std::string KEYWORDS_A[] = {"AXX", "AYY"};  
REGISTER_VEC(A);  
static const std::string KEYWORDS_B[] = {"BXX", "BYY"};  
REGISTER_VEC(B); 

some_config.h был включен в some.cpp, в котором использовались переменные KEYWORDS_A_VEC и KEYWORDS_B_VEC. Однако для текущего кода компилятор g ++ выдаст ошибку, не найдя определения KEYWORDS_A_VEC и KEYWORDS_A_VEC.
Что-то не так с кодом? Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 12 февраля 2011

Ваша проблема с компиляцией вызвана тем, что вам нужно использовать токенизацию в каждом месте, которое вы собираетесь токенизировать, например ::10000

#define REGISTER_NAME(NAME) blah_##NAME##_blah

(обратите внимание на использование ## на обеих сторон NAME.)

Что касается того, является ли это хорошей практикой, я бы сказал, нет. У вас есть один макрос, создающий несколько переменных, что сбивает с толку читателя вашего кода. Многие IDE и отладчики могут запутаться из-за такого рода вещей, а это означает, что читателю придется много искать вручную, чтобы определить, где переменные магически объявляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...