2010-04-28 3 views
4

다음과 같은 이유가 설명 될 수 있습니까?C++ 번역 단계 혼동

int main() // Tried on several recent C++ '03 compilers. 
{ 
    #define FOO L 
    const wchar_t* const foo = FOO"bar"; // Will error out with something like: "identifier 'L' is undefined." 
    #undef FOO 
} 

전 처리가 문자열 리터럴 작업 및 일반 토큰 변환보다 이전 번역 단계에서 수행 된 것으로 생각했습니다.

컴파일러는 더 많거나 적은이보고하지 않을까요 : 누군가가 표준에서 설명을 인용 수 있다면

int main() 
{ 
    const wchar_t* const foo = L"bar"; 
} 

그것은 좋은 것입니다. 그것은 다른 것, 그것은 그냥 L의 모든 FOO의 교체 후 (의미 끝나는 것을 모르는 않습니다 전에

답변

6

사용 : 후행 \없이

#define FOO L\ 

것이있을 것 사이의 공백과 매크로 대체시 문자열.

#define FOO(x)  L ## x 

과 같이 사용 : 나는 정의)이 방법 마이크로 소프트의 _T을 (정의 할 수 있다고 생각 요한의 대답하는 대신

const wchar_t* const foo = L "bar"; 
+0

물론! 감사. 실제로 사전 처리 된 출력을 조사 했어야합니다 ... – blakecl

+2

이 정의와 다음 줄 사이에 빈 줄을 두십시오. 그렇지 않으면 매크로가 계속됩니다. 필자는 과거에 여러 번 사용하여 여러 줄 매크로를 만들었습니다. –

+1

준수 전 처리기가 토큰 기반이므로 적합 전처리 기에서 작동하지 않습니다. 두 개의 토큰을 하나로 결합하는 유일한 방법 (예 :'L'과''bar "')은 연결 연산자 ('##')를 사용하는 것으로 대체 목록의 마지막 토큰으로 사용할 수 없습니다. –

0

당신이 전처리되는 수단을 받고있어 오류 메시지가 #define, 무슨 L을 찾습니다 의미와는 거리가 멀다.)

컴파일러에서 두 번째 코드 비트를보고 있는데, 그 시점에서 컴파일러는 L"bar"이 무엇을 의미하는지 모릅니다.

모든 것이 정의되고 올바르게 포함 되었습니까?

# 1 "ttt.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "ttt.cc" 
int main() 
{ 

    const wchar_t *const foo = L "FOO"; 
} 

후 처리기 (g ++ -E)의 출력에서 ​​

0

봐는 공간이있다하여 L.

1

:이 g++ -E의 결과에서이다 :

FOO("bar") 

이렇게하면 L을 텍스트와 적절하게 연결합니다.

+0

감사합니다. 이것에 대해 알고 있습니다. 나는 이미 _T (와 친구들)을 사용하고 있는데,이 코드를 가지고 장난 할 때이 "문제"를 우연히 발견했다. – blakecl