2010-04-22 7 views
1

를 대체하지 않습니다 : NAME의C++ 매크로 내가이 매크로 다음 모든 값

#define SCOPED_ENUM_HEADER(NAME) struct NAME{ enum _NAME{ 
#define SCOPED_ENUM_FOOTER(NAME) };}; typedef NAME::_NAME NAMEtype; 

첫 번째 인스턴스가 전달 된 이름으로 대체 얻을. 그게 뭐가 잘못 됐어?

되어 같은 방식으로 사용할 수있다 :

SCOPED_ENUM_HEADER(LOGLEVEL) 
    UNSET, 
    FILE, 
    SCREEN 
SCOPED_ENUM_FOOTER(LOGLEVEL) 
+0

매크로는 위험하므로 피해야합니다. – fmsf

+0

LOGLEVEL은 매크로입니까? – LB40

답변

8

문제는 NAME_NAME가 동일하지 않다는 것이다; 두 개의 완전히 다른 식별자입니다. 당신은하지만, 밑줄을 붙이는 정말 조심해야 할

_##NAME 

:

당신이 매개 변수 NAME 무엇이든의 전면에 밑줄을 추가하려면

는 연결 ( ##) 연산자를 사용합니다. 밑줄과 대문자로 시작하는 모든 식별자는 구현에 예약되어 있습니다.

+0

이봐, 그 대답은 내가 타이핑하고있는 대답이다. 오 잘. +1. –

+0

고마워, 나는 어떤 일치든지 대체 할 것이지만 ... –

+1

@JP 어떤 상황을 무차별로 대체한다면 FOONAMEBAR을 대체 할 것이다. 아마도 당신이 원하는 것이 아닐 것이다. –

1

각 매크로에는 NAME 인스턴스가 하나만 있습니다. 또한 각 매크로에는 _NAME의 예제가 있지만 매우 의심 스럽습니다. 밑줄로 시작하고 대문자를 따르는 이름은 구현을 위해 예약되어 있으므로 거기에 문제가있을 수 있습니다.

그러나 NAME의 값을 받아서 연결하려면, E_을 앞에 놓고 보겠습니다. 이 _##NAME 때문에 일반적으로 상관없이 당신이 무엇을 넣어 당신에게 _NAME을 얻을 것이다, 조금 까다 롭습니다

이것은 C++ FAQ Lite에 설명,하지만 당신이 정말로해야 할 것은 무엇인가입니다 :.

#define REALLY_CONCATENATE(a,b) a ## b 
#define CONCATENATE(a,b) REALLY_CONCATENATE(a,b) 
#define SCOPED_ENUM_HEADER(NAME) struct NAME{ enum CONCATENATE("E_", NAME) { 

(죄송합니다. 지금 당장은 이것을 테스트 할 수 없습니다).

한편, 당신이하고있는 일을하는 더 좋은 방법이 있어야합니다. 진지하게.

+0

감사합니다 :) 당신은 조금 너무 늦었습니다 :) –