C ++ 매크로 : 매개 변수 조작 (특정 예)
-
03-07-2019 - |
문제
교체해야합니다
GET("any_name")
~와 함께
String str_any_name = getFunction("any_name");
어려운 부분은 견적 표시를 다듬는 방법입니다. 가능한? 어떤 아이디어?
해결책
어때요 :
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
또는 중첩 된 매크로 문제에 대한 안전한 보호를 위해 :
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));
용법:
SAFE_GET(foo)
그리고 이것은 편집 된 것입니다.
String str_foo = getFunction("foo");
키 포인트:
- ##을 사용하여 매크로 매개 변수를 단일 토큰으로 결합합니다 (Token => 변수 이름 등)
- 및 # 매크로 매개 변수를 문자화하기 위해 (C/C ++에서 "반사"를 수행 할 때 매우 유용합니다)
- 매크로에 접두사를 사용하십시오. 모두 같은 "네임 스페이스"에 있고 다른 코드와 충돌을 원하지 않으므로. (사용자 이름을 기준으로 MLV를 선택했습니다)
- 래퍼 매크로는 매크로를 중첩하면 다른 매크로에서 MLV_GET을 호출하여 다른 병합/문자열 크기의 매개 변수를 호출합니다 (아래의 의견에 따라 감사합니다!).
다른 팁
한 가지 방법은 매크로를 호출 할 때 이름을 인용하지 않는 것입니다.
#include <stdio.h>
#define GET( name ) \
int int##name = getFunction( #name ); \
int getFunction( char * name ) {
printf( "name is %s\n", name );
return 42;
}
int main() {
GET( foobar );
}
귀하의 질문에 대한 답으로, 아니요, C ++의 인용문을 "스트립"할 수 없습니다. 그러나 다른 답변에서 알 수 있듯이 "추가 할 수 있습니다". 어쨌든 항상 문자열 문자로 작업하고 있으므로 (맞습니까?) 새 방법으로 전환 할 수 있어야합니다.
제휴하지 않습니다 StackOverflow