2013-08-09 2 views
1

"clear()"함수를 정의한 "PDCurses/curses.h"를 포함하고 있는데, 'std : : wstring :: clear() 'msvc-10.0 컴파일러가 오류를보고합니다. 포함 후에 #undef clear()를하면 수정됩니다. 코드는 다음과 같다 :"#define clear()"와 "std :: wstring :: clear()"사이의 혼동

inline void str_clear(std::wstring& wstr) 
{ 
    wstr.clear(); 
} 

내가 사용하는 '표준 :'그런데 왜 컴파일러는 여전히 혼란? 5 월 다중 정의 된 '네임 스페이스'가 원인 일 수 있습니까?

+2

전처리를 볼 수 있도록하는 clear()를 대체 할

wstr.clear(); 

사용, 그것은 맹목적으로 물건을 대체합니다. 'clear()'는 헤더에 넣는 엉성한 매크로입니다. – Thomas

+0

'# define'이라면, 컴파일하기 전에 뭔가 다른 것으로'clear (...) '를 대체 할 것입니다. – juanchopanza

+1

'clear()'이 말 그대로'(wstr.clear)()'와 같은 방식으로 코드를 다시 작성함으로써 피할 수 있습니다. – hvd

답변

8

이유는 전 처리기가 정의 된 모든 매크로에서 기본적으로 검색 및 바꾸기 때문입니다. 그리고 컴파일러가 적절한 코드를 얻기 전에 끝났으며 일반적으로 네임 스페이스, 클래스 또는 범위에 대해서는 알지 못합니다.

예.

#define clear() something 

후 전처리 컴파일러가 유형 또는 네임 스페이스에 대해 상관하지 않는다

wstr.something; 
+0

컴파일러는 'wstr'유형에서 검색하지 않습니까? – NFDream

+4

@NFDream : 컴파일러는; 매크로는 유형, 범위 또는 언어 구문의 다른 측면을 전혀 모르는 선처리 프로세서에 의해 확장됩니다. 컴파일러가 수행하기 전에 단순히 토큰을 다른 토큰으로 대체합니다. –

+1

그리고 가능한 경우 매크로를 정리해야합니다. 또한 많은 C/C++ 서적에서 매크로를위한 별도의 네임 스페이스를 만들려면 ALL UPPERCASE라는 이름을 지정하는 것이 좋습니다. – Tomek

관련 문제