2010-07-27 4 views
0

최근에 gcc에서 clang으로 전환하기로 결정했으며 넓은 문자 상수를 사용할 때 다음과 같은 경고가 표시됩니다. " 넓은 문자 상수가 무시되었습니다. ". 여기에 경고를 얻는 코드입니다 : 여기와이드 문자 상수를 clang과 함께 사용 "넓은 문자 상수에서 외래 문자를 무시합니다."오류

wstring& line; 
… 
for (wstring::iterator ch = line.begin(); ch != line.end(); ++ch) 
    switch (*ch) { 
     case L'│': *ch = L'|'; break; 
     case L'﹤': *ch = L'<'; break; 
     case L'﹥': *ch = L'>'; break; 
     case L'﹙': *ch = L'('; break; 
     case L'﹚': *ch = L')'; break; 
     default: break; 
    } 

을의 경우 조건의 문자 모두 높은 유니 코드 문자 때문에 그 소리 파서에 의해 멀티 바이트 문자로 볼 수는 분명히 (소스 코드 UTF-8 인코딩 됨).

제 질문은 경고 메시지의 의미입니다. 즉, 정확히 무시되고있는 것입니다. 또한,이 경고가 주어지면 제 프로그램은 설계대로 작동합니까?

gcc는이 코드에 대해 경고하지 않으며 모든 것이 매력처럼 작동합니다.

답변

1

프로그램의 핵심은 소스 파일의 해석입니다. UTF-8로 인코딩되어 있다는 것을 알고 있습니다. 이것이 6 바이트 L'﹤'이 4 유니 코드 문자로 해석되는 이유입니다. 그러나 어떻게 알았을까요? 6 바이트를보고 8 비트 인코딩을 가정합니다. 따라서 L'xyz'이 표시됩니다 (정확한 문자는 가정 된 8 비트 문자 집합에 따라 다릅니다). clang은 L'xyz'L'x'으로 해석하고 y와 z를 무시한다고 알려줍니다. 의도 한대로 작동하는 것은 거의 없습니다.

+1

흠 gcc는 아무런 문제가 없었습니다. clang에게 UTF-8 소스 파일을 제대로 처리하도록하거나 또는 와이드 문자를 입력하여 clang이 이해할 수 있도록 할 수 있습니까? –

+1

http://github.com/bratsche/clang은 다음을 제안하지 않습니다. IV. 누락 된 기능/개선 Lexer : * 소스 문자 매핑. GCC는 ASCII와 UTF-8을 지원합니다. – MSalters