2012-03-11 3 views
1

Visual Studio의 C++ 파일에 windows.h가 포함되어 있으면 STANDARD_RIGHTS_ALL이라는 전역 식별자가 정의됩니다. 그 이름을 내가 만드는 클래스의 정적 멤버 변수 이름으로 사용하고 싶습니다. 나는 다음과 같이정적 멤버 이름으로 전역 변수 이름을 바꿉니다.

int ACLAmigo::STANDARD_RIGHTS_ALL = 1; 

...이있는 다른 파일에 나중에 ...

class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

을 그것을 시도하지만 IDE는 thusly 히 불만 : "오류 : 예상 식별자를".

질문 : 이미 선언 된이 식별자 STANDARD_RIGHTS_ALL을 멤버 변수 이름으로 사용할 수 있습니까?

+2

STANDARD_RIGHTS_ALL은 (는) 아마도 매크로입니다. #undef 수 있지만 문제를 요구할 수 있습니다. –

+0

실제로 "#define STANDARD_RIGHTS_ALL (0x001F0000L)"입니다. 매크로 이름을 사용하여이 변수에 내 변수를 설정하려고하기 때문에 실제로는 정의 할 수 없습니다 (#define은 매크로입니다). 내 변수 이름 앞에 밑줄을 추가하면 작동합니다. 내가해야만한다면 나는 그걸로 살아갈 것이다. 그러나 그렇게하지 않는 것이 좋을 것이다. –

+0

그 문제를 다루는 답변을 추가했습니다. –

답변

1

STANDARD_RIGHTS_ALL (및 대부분의 다른 것들)은 매크로입니다. 매크로는 항상 "전역 적으로 정의됩니다". 말도 안되는이다

static int 0x001F0000 /*STANDARD_RIGHTS_ALL*/; 

: 컴파일러는 코드가로 변신 있도록 코드를 분석을 시작하기 전에 또한, 그들은 전처리에 의해 해결하고 있습니다.

어느 다른 변수 이름을 선택, 또는 매크로 정의를 해제 :

#undef STANDARD_RIGHTS_ALL 
static int STANDARD_RIGHTS_ALL; // now it's ok 
+0

고마워요. 나는 변수의 이름을 바꾸고있다. 분기 질문 : 모든 대문자로 정적 클래스 멤버 이름을 지속적으로 제공하는 것은 표준/모범 사례로 간주됩니까? –

+0

대회에 따라 다릅니다. 나는 개인적으로 이렇게하지 않는다. 정적 인 멤버가's_' 접두어를 붙이는 컨벤션에 충실합니다. – valdo

1

음, STANDARD_RIGHTS_ALL 때문에 실제로 매크로입니다 :

#define STANDARD_RIGHTS_ALL    (0x001F0000L) 
내가 일을 더 안전 방법은 없습니다 말하고 싶지만

그것.

#undef STANDARD_RIGHTS_ALL 
class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

을하지만 당신은 그냥 다른 이름을 선택하면 오프 훨씬 더 위치 :

당신은 그것을 정의를 해제 할 수있다.

실제로 표준 매크로를 정의 해제하는 것은 정의되지 않은 동작입니다. 이것은 표준 매크로는 아니지만 정의되지 않은 동작으로 이어질 수도 있습니다. 확실히 이름을 바꿔야합니다.

+0

감사합니다. 나는 변수의 이름을 바꾸고있다. 분기 질문 : 모든 대문자로 정적 클래스 멤버 이름을 지속적으로 제공하는 것은 표준/모범 사례로 간주됩니까? –

1

예를 들어 1로 설정했지만 실제로 STANDARD_RIGHTS_ALL 매크로가 일반적으로 가지고있는 값으로 설정하려고한다고 생각합니다.

class ACLAmigo 
{ 
public: 
    static const int standard_rights_all = STANDARD_RIGHTS_ALL; 
#undef STANDARD_RIGHTS_ALL 
    static const int STANDARD_RIGHTS_ALL = standard_rights_all; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

하지만,이 매크로를 사용하는 다른 헤더 파일 전에 포함됩니다 헤더 파일에 발생하면이 쉽게 문제가 발생할 수 :

난 당신이 같은 것을 달성 할 수 있다고 생각.

관련 문제