gcc 4.4.1#define 설명문
나는 누군가의 코드를 유지하고 있으며, 내가 이해하지 못하는 것을 발견했다.
#define RES_API(name, func) name##_##func
누구든지 설명 할 수 있습니까?
많은 감사,
gcc 4.4.1#define 설명문
나는 누군가의 코드를 유지하고 있으며, 내가 이해하지 못하는 것을 발견했다.
#define RES_API(name, func) name##_##func
누구든지 설명 할 수 있습니까?
많은 감사,
##
연산자는 두 개의 토큰을 연결합니다. 귀하의 경우 name
에 밑줄이 추가되며 그 뒤에 func
이 추가됩니다.
따라서 RES_API(aName, aFunc)
은 aName_aFunc
이됩니다.
그 자체로는 다소 성가신 것처럼 보입니다. 나는 C와 C++ 코드를 섞을 때 C 라이브러리가 네임 스페이스에 배치하는 동안 C 라이브러리가 자신의 함수 앞에 접두어를 붙이는 경향이 있으므로 사용법을 볼 수있었습니다.
#define RES_API(name, func) name##::##func
당신은 갑자기 C 인터페이스 또는 C++ 사이를 전환 할 수있는 일반적인 방법이 있습니다
같은, 다른 정의를 감안할 때.##
는 연결 연산자입니다. 코드에 RES_API(name1, func1)
을 사용하면 name1_func1
으로 바뀝니다. 더 많은 정보 here.
OBJ_DoSomething
대신이 매크로를 사용하면 RES_API(OBJ, DoSomething)
을 사용할 수 있습니다. 개인적으로 나는 바보 같다고 생각합니다.
엄청나게 많은 양의 전처리 프로그램이 '어리석은'일 것입니다. 왜 갑자기 그 이유가 없는지 알 수 있습니다. – KevinDTimm
나는 이미 당신의 답을 알고 있지만, C Preprocessor magic의 할당량을 설명하는 C-FAQ에 대한 훌륭한 정보가 있습니다.
큰 링크였습니다. 거기에 varargs 함수를 수행하는 것과 같은 다른 것들이 필요했습니다. 큰. – ant2009
C++ 코드에 토큰 붙여 넣기 연산자가 정말로 필요합니까? 나는 컴파일러가 '::'이 유효한 식별자가 아니라는 것을 알릴 것을 기대한다. –