2009-12-14 3 views
3

gcc 4.4.1#define 설명문

나는 누군가의 코드를 유지하고 있으며, 내가 이해하지 못하는 것을 발견했다.

#define RES_API(name, func) name##_##func 

누구든지 설명 할 수 있습니까?

많은 감사,

답변

4

## 연산자는 두 개의 토큰을 연결합니다. 귀하의 경우 name에 밑줄이 추가되며 그 뒤에 func이 추가됩니다.

따라서 RES_API(aName, aFunc)aName_aFunc이됩니다.

그 자체로는 다소 성가신 것처럼 보입니다. 나는 C와 C++ 코드를 섞을 때 C 라이브러리가 네임 스페이스에 배치하는 동안 C 라이브러리가 자신의 함수 앞에 접두어를 붙이는 경향이 있으므로 사용법을 볼 수있었습니다.

#define RES_API(name, func) name##::##func 

당신은 갑자기 C 인터페이스 또는 C++ 사이를 전환 할 수있는 일반적인 방법이 있습니다

같은, 다른 정의를 감안할 때.

+0

C++ 코드에 토큰 붙여 넣기 연산자가 정말로 필요합니까? 나는 컴파일러가 '::'이 유효한 식별자가 아니라는 것을 알릴 것을 기대한다. –

6

##는 연결 연산자입니다. 코드에 RES_API(name1, func1)을 사용하면 name1_func1으로 바뀝니다. 더 많은 정보 here.

1

OBJ_DoSomething 대신이 매크로를 사용하면 RES_API(OBJ, DoSomething)을 사용할 수 있습니다. 개인적으로 나는 바보 같다고 생각합니다.

+2

엄청나게 많은 양의 전처리 프로그램이 '어리석은'일 것입니다. 왜 갑자기 그 이유가 없는지 알 수 있습니다. – KevinDTimm

4

나는 이미 당신의 답을 알고 있지만, C Preprocessor magic의 할당량을 설명하는 C-FAQ에 대한 훌륭한 정보가 있습니다.

+0

큰 링크였습니다. 거기에 varargs 함수를 수행하는 것과 같은 다른 것들이 필요했습니다. 큰. – ant2009