2011-10-23 3 views
14

#define에 이중 콜론을 사용할 수 있습니까? 구현 파일에 일부 글을 저장하고 싶습니다. like :#define에 이중 콜론 (: :) 사용

// foo.h 
#define template template <class T> 
#define foo:: foo<T>:: 

template class foo { 
    T& baz(); 
}; 

#include "foo.tpp" 
#undef template 
#undef foo:: 

// foo.tpp 
template T& foo::baz() { 
    // do stuff. 
} 

하지만 실제로 이해할 수없는 구문 오류가 발생합니다. (codepad의 예를 참조)

Line 11: error: missing whitespace after the macro name
Line 10: error: extra tokens at end of #undef directive
Line 4: error: 'foo' is not a template
compilation terminated due to -Wfatal-errors.

+0

잘 묻는 질문이지만 문법 오류도 게시 할 수 있습니다. –

+5

그것이 작동하더라도 (실제로 신이 감사하지는 않지만) 나에게 정말 나쁜 생각 인 것 같습니다. 아무도 당신의 코드를 이해하거나 유지할 수 없습니다. 당신의 계승자들은 당신의 모습으로 핀을 꽂을 것입니다. – TonyK

답변

16

호 매크로의 이름이어야 식별자; 다른 문자로 구성 될 수 없으며 여러 개의 토큰으로 구성 될 수 없습니다.

#define templatetemplate이 식별자가 아니기 때문에 잘못되었습니다. 키워드입니다. 이 :: foo<T>::로 대체 foo라는 매크로를 정의한다 (즉,하지 당신이 원하는 무엇, 그러나 유효 했다) :

#define foo:: foo<T>::

는 C90에서 유효 및 C++ (98). 그러나 언어의 최신 개정판에는 객체와 같은 매크로의 이름과 교체 목록 (교체되는 토큰) 사이에 공백이 있어야하므로 C99 및 C++ 11에서는 유효하지 않습니다.

관련 문제