2017-12-13 3 views
0

나는 여기처럼 보이는 몇 가지 코드가 어떤 코드가 나는 오류가Visual Studio에서 typedef 열거 형과 정의가 충돌하는 이유는 무엇입니까? <code>syntax error: 'constant'</code>를 : Visual Studio에서 컴파일 할 때

#define ERROR 0 

namespace lib{ 
    class Logger{ 
     public: 
      typedef enum {ERROR = 1} LogLevel; 
    }; 
} 

(I 물론, 그것을 간체). 문제는 내가 정의와 typedef enum에 ERROR라는 단어를 다시 사용한다는 것이 분명하다.

누구나 네임 스페이스와 클래스 안에 포함 된 일부 변수 이름에 영향을주는 정의 논리를 알고 있습니까? 내 말은, ERRORlib::Logger::ERROR과 어떻게 혼동시킬 수 있는지는 내 생각에 완전히 다른 범위를 가지고 있기 때문입니다.

+6

매크로입니다. 즉, 컴파일러가 'ERROR'로 보는 모든 곳에서 'ERROR'로 바뀝니다. 그리고, "g ++로 컴파일하지"않습니다. 뭔가 다른 것이 컴파일되지만이 코드는 컴파일되지 않습니다. –

+2

주된 이유는 Java/Python 규칙 (상수의 경우 대문자)이 C++에서 채택되지 않았기 때문입니다. –

+2

** - 1 ** 실제 코드 **가 아닌 코드를 게시하는 경우. –

답변

6

전 처리기 #define 대체 코드는 코드를 컴파일 할 때 가장 먼저 발생합니다. 이러한 대체는 텍스트로 이루어지며 C++ 구문을 무시합니다. 코드는 동일합니다 :

namespace lib{ 
    class Logger{ 
     public: 
      typedef enum {0 = 1} LogLevel; 
    }; 
} 

그것은 0 당신의 enum 정의와 ERROR의 대체 후 잘못을 형성하고, 분명합니다.

다른 프로세서가 동일한 작업을 대신 수행 할 수있는 경우 선행 처리기를 사용하면 일반적으로 나쁜 생각으로 간주됩니다. 이 질문은 그것을 사용하는 것과 관련된 많은 위험 중 하나를 설명합니다. 질문 Why are preprocessor macros evil and what are the alternatives?을보십시오.

+0

@ FrançoisAndrieux 아마도 매크로는 일반적인 사용에서 악의적 인 것으로 간주 될 수 있습니다. 그러나 namesspace가 오타 였음을 이해할 수 있도록 upvote가 있어야합니다. – UKMonkey