2009-07-13 4 views
5

나는 다이렉트 2009년 3월 SDK와 함께 제공되는 DXUTCore 프로젝트를 통해보고, 대신 일반적인 접근 방법을 만드는, 그들은 다음과 같은 일반적인 접근, 생성하는 매크로를 사용하는 것을 발견했다 :C++에서 ## 연산자의 목적은 무엇이며, 무엇을 호출할까요?

#define GET_ACCESSOR(x, y) inline x Get##y() { DXUTLock l; return m_state.m_##y;}; 
... 

GET_ACCESSOR(WCHAR*, WindowTitle); 

그것을 # 연산자는 두 번째 인수의 텍스트를 매크로에 삽입하여 해당 텍스트를 사용하는 변수에서 작동하는 함수를 만드는 것처럼 보입니다. 이것은 C++에서 표준 인 것입니까 (Microsoft가 아닌)? 그것의 사용은 좋은 연습으로 간주됩니까? 그리고, 그 운영자는 무엇이라고 부릅니까?

+1

화재로 태워서 나를 신뢰하십시오. – clemahieu

답변

16

프리 프로세서가 두 개의 토큰을 단일 토큰으로 결합하는 데 사용합니다.

5

공백을 삽입하지 않고 왼쪽 및 오른쪽 피연산자를 연결하는 전처리 연산자입니다. 나는 그것이 마이크로 소프트에만 국한된 것이라고 생각하지 않는다.

+5

확실히 그렇지 않습니다. 사전 처리기를 포함한 C가 MS보다 오래 되었음 : – Joey

+0

나는 그렇게 생각했지만, C 스펙을 읽지 않고 100 % 확신하지 못했기 때문에 확실하게 알 수 없었다. ;) –

+0

그러나 ## preprocessor 연산자는 원래 C가 아니며 이전 버전이지만 Microsoft보다 먼저 선행한다고 생각하지는 않습니다. –

1

는 매크로 인수에 대한 연결의 즉

GET_ACCESSOR (int, Age); 

inline int GetAge() { DXUTLock l; return m_state.m_Age;}; 
3

이없는 표준 C++ 인에 소비 될 것이다, 그것은 표준 C.가 this Wikipedia article을 확인합니다.

그리고 좋은 연습입니까? 일반적으로 전처리 매크로는 싫지만 고토보다 나쁘지는 않습니다.

편집 : 분명히 나는 ​​이것이 "표준 C++가 아닌 표준 C"라는 의미에 의해 오해되고 있습니다. 많은 사람들이 첫 번째 문구를 읽고 두 번째 문구를 읽지 못하고 있습니다. 내 의도는 매크로 C.

+1

이것은 표준 C++입니다. 내 대답은 아래를 참조하십시오. – GManNickG

+1

랜돌 포 (Randolpho)의 주장은 C++이 표준에서 가지고 있을지도 모른다는 것입니다. 즉, C++보다 우선합니다. 즉 C 표준 (기상 표준 C 또는 C)이기도합니다. –

+0

아, 그냥 "이것은 표준 C++가 아닙니다"와 관련이 있습니다. 이는 사실이 아닙니다. – GManNickG

2

메흐 다드 말했듯에서 C++ 상속 된 것을 지적하는 것입니다, 그것은 같은 피연산자을 연결 : MISRA C에서 알 수 있다는

#define MyMacro(A,B) A ## B 
MyMacro(XYZ, 123) // Equivalent to XYZ123 

참고이 피연산자 (그리고 # ' stringify '피연산자)는 컴파일러 종속 계산 순서로 인해 사용되어서는 안됩니다.

2

표준 C++에서 허용하는 토큰 붙여 넣기 연산자입니다 (자세한 내용은 16.3.3 참조). 모범 사례 : 매크로 사용은 IMHO (C++에서)에 적합하지 않습니다.

6

Raldolpho에 명시된 것과는 대조적으로 표준 C++입니다.

16.3.3 ## 연산자 [cpp.concat]

1은 ## 전처리 토큰 가 시작 또는 끝 의 발생하지 않는다 : 여기서

는 중요한 정보 인 매크로 정의의 양식 에 대한 대체 목록.상기 교체리스트에 파라미터 바로 토큰 전처리 ## 앞에 또는 뒤에 경우

2 파라미터는 해당 인수의 전처리 토큰 서열에 의해 대체된다. 교체리스트 전에 두 오브젝트 형상과 함수 같은 매크로 호출에

3

, 는 은 (되지로부터 여분 리스트에서는, ## 전처리 토큰의 각 인스턴스를 대체 더 매크로 이름을 재검토되고 인수)가 삭제되고 이고 앞의 전처리 토큰 이 다음 전처리 토큰과 연결됩니다. 결과가 유효한 전처리 토큰이 아닌 이면 동작은 정의되지 않습니다. 그 결과 나타나는 토큰은 매크로로 사용할 수 있습니다. 연산자 ##의 평가 순서는 지정되지 않았습니다.

관련 문제