문제

교체해야합니다

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 ++의 인용문을 "스트립"할 수 없습니다. 그러나 다른 답변에서 알 수 있듯이 "추가 할 수 있습니다". 어쨌든 항상 문자열 문자로 작업하고 있으므로 (맞습니까?) 새 방법으로 전환 할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top