2013-01-03 6 views
0

내 코드에서 로그 레벨을 정의하고 싶습니다 : 원치 않는 재정

#define INFO 1 
#define WARNING 2 
#define ERROR 4 
#define DEBUG 8 

그러나 다른 표준 Microsoft libs와 오류에

이미 정의 즉도 예약 된 것 같습니다. 그런 상황을 어떻게 다루어야합니까?

+0

이러한 상황에서 최종 결과를 원하십니까? 그리고 무엇을 시도 했습니까? –

답변

0

Microsoft는 불행히도 마음에 들거나하지 않더라도 코드에 주입되는 많은 매크로를 정의합니다. 따라서 오류를 반복하지 않고 매크로를 정의하지 않는 것이 좋습니다.

매크로 대신 상수을 정의하고 이름 충돌을 피하기 위해 네임 스페이스 안에 넣는 것이 좋습니다. 예를 들어 :

namespace Log 
{ 
    const int Info = 1; 
    const int Warning = 2; 
    const int Error = 4; 
    const int Debug = 8; 
} 

는 그런 다음 등등 Log::Info, Log::Error과 같은 코드에서 사용할 것입니다.

편집 :이 경우

enum LogLevel 
{ 
    Info = 1; 
    Warning = 2; 
    Error = 4; 
    Debug = 8; 
} 

당신이 enum 유형 값을 접두사 필요가 없습니다 : tinctorius입니다 코멘트에 지적한 것처럼, 당신은 아마이 경우에 enum를 사용하여 더 나을 것 이름, 그냥이 유형의 변수를 사용하십시오. 예를 들면 다음과 같습니다.

LogLevel level = Warning; 

이는 유형 안전성을 제공한다는 장점이 있습니다. 다른 enum의 이름을 다시 사용할 수도 있습니다.

+0

'enum'이 더 좋을 것입니다. –

+0

@Tinctorius 예,이 목적을 위해 더 좋을 것입니다. 내 대답을 업데이트 중입니다. – Gorpik

+0

또 다른 이점은'const int'는 사용에 따라 전역 변수로 취급 될 수 있다는 것입니다 ('int * p = (int *) & Warning; * p = 0'). 'const int'는 그 이름 *을 통해 제한된 액세스 *를 갖는'int' 이상일 뿐이며 옵티마이 저는 내부 저장소를 변경하기 전에 기본 저장소가 결코 변경되지 않는다고 확신시켜야합니다. –