2009-05-20 3 views
0

예외를 선언 할 때 사용하는 간단한 매크로가 있습니다. 디버그 모드에 있으면 현재 파일과 행 번호가 추가됩니다.간단한 매크로 확장에서 "선언되지 않은 식별자"오류가 발생했습니다.

유니 코드를 지원하도록 코드를 수정하는 중입니다. 매크로를 사용할 때마다 갑자기 "선언되지 않은 식별자"오류가 발생합니다. 매크로 자체가 다소 단순하기 때문에 나는 정말 간단한 것을 놓치고있을 것입니다. 아무도 그 문제가 무엇인지 말할 수 있습니까?

다음은 매크로 선언입니다 :

#ifdef _DEBUG 
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), _T(__LINE__)) 
#else 
#define EXCEPTION(msg, mm) Exception(msg, mm) 
#endif 

내가 필요할 생각하지만, 단지의 경우, 여기에 예외 생성자 선언입니다하지 않습니다

Exception(LPCTSTR msg, BOOL manageMsg = FALSE, LPCTSTR f = NULL, int l = -1); 

내가 '돈 릴리스 모드에서 컴파일 오류가 발생하지 않지만 디버그 모드에서는 __FILE__ 및 __LINE__ 비트가있는 것이므로 실제 문제가 무엇인지 알 수는 없습니다.

+0

전체 실제 오류 메시지를 게시하십시오. 매크로를 사용하는 방법과 코드에서 어떤 줄의 오류가 발생했는지에 대한 예를 게시하십시오. –

+0

그 *는 전체 오류입니다. 그래서 그 중 어떤 부분이 문제인지 알 수 없었습니다. 오류 메시지에 다른 것이 없습니다. – Herms

답변

3

__LINE__ 매크로는 정수로 평가됩니다. _T 매크로는 문자열 앞부분에 L을 입력하여 유니 코드 문자열로 만듭니다. 그 뒤에는 큰 따옴표 (예 : L"file.cpp")가옵니다. 그러나 귀하의 경우에는 __LINE__으로 확장되는 정수 리터럴이옵니다. 너는 다음과 같은 것을 얻고있다 : L23. 두 번째 _T 호출을 제거하십시오.

#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), __LINE__) 

컴파일러가 인식하지 못한 식별자의 이름을 포함 시키면 더 쉽게 진단되었을 수 있습니다. 컴파일러는 대개 해당 정보를 오류 메시지에 포함시킵니다.

+0

이름이 없습니다. 전체 오류는 "선언되지 않은 식별자"입니다. 그래서 그걸 알아 채지 못했습니다. – Herms

+0

그게 전부 였어. 나는 _T() 매크로를 추가 할 때 너무 열중했다. 나는 그것이 바보 인 것을 알고 있었다! – Herms

2

이것은 정확하게 동일한 문제는 아니지만 조사 중에이 질문을 발견했기 때문에 여기에서 내 문제에 대한 해결책을 게시하고 있습니다.

여러 줄 매크로가있는이 오류 메시지가 나타나면 편집기에서 보이는 공백을 켭니다. 당신은 라인의 끝에 '\'연속 문자 다음에 공백이있을 수 있습니다 :

#define FOO_BAR(aFoo) \ 
    FOO_BASE(aFoo, "bar") 

끝에있는 공간이 완전 매크로 정의 (FOO_BAR이 '에 확장의 첫 번째 줄을 구문 분석 파서 원인 \ '), 두 번째 줄은 함수 선언으로 해석되므로 "선언되지 않은 식별자'aFoo '").

관련 문제