2011-02-12 9 views
2

매크로를 사용하여 일부 전역 변수를 선언 할 때 문제가 발생했습니다. 여기의 경우 :C++의 헤더 파일에서 매크로를 사용하여 변수를 선언하는 것이 옳습니까?

원래 코드 :

/* 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의 정의를 찾지 못하는 오류를 표시합니다.
코드에 문제가 있습니까? 당신의 도움을 주셔서 감사합니다. 당신은 당신이 토큰 화하고자하는 모든 장소에서 토큰 것, 예를 들어 필요가 있기 때문에 귀하의 컴파일 문제가 발생

+0

전처리 기가 매크로 확장에 나타나는 매크로를 반복적으로 채우는 것과 관련이 있다고 생각합니다. 나는이 주제에 관해서는 상대적으로별로 알지 못하므로, 다른 C++ 전문가에게 맡겨서 도움을 줄 것이다. – templatetypedef

답변

3

: (. NAME모두면에 ##의 주 사용)

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

이것이 좋은 연습인지 아닌지에 관해서는, 나는 아니오라고 말할 것입니다. 여러 변수를 인스턴스화하는 단일 매크로가있어서 독자의 코드를 혼란스럽게합니다. 많은 IDE와 디버거는 이런 종류의 일로 혼란스러워 할 것입니다. 즉, 변수가 마술처럼 선언되는 곳에서 독자가 많은 수작업을해야합니다.

+2

그리고 매크로에서 혼란스러운 에러 메시지가 나올 때, g ++ -E는 여러분의 친구입니다 - 전처리기를 통해 컴파일러가 실행되므로 컴파일러가 그 시점에서 볼 수있는 것을 볼 수 있습니다 – Petesh

관련 문제