매크로 인수를 문자열 리터럴로 사용하는 방법은 무엇입니까?


90

변수 이름의 문자열 리터럴 표현과 변수 자체를 함수로 전달하는 매크로를 작성하는 방법을 알아 내려고합니다.

예를 들어 다음과 같은 기능이 있습니다.

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

이 작업을 수행 할 수 있도록 매크로를 작성하고 싶습니다.

int my_val = 5;
CALL_DO_SOMETHING(my_val);

다음과 같이 인쇄됩니다. my_val: 5

다음을 시도했습니다.

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

그러나 짐작할 수 있듯이 따옴표 안의 VAR은 대체되지 않고 문자열 리터럴 "VAR"로 전달됩니다. 따라서 매크로 인수를 문자열 리터럴 자체로 바꾸는 방법이 있는지 알고 싶습니다.


이것을 어떻게 사용하려고합니까?
chris

답변:



28

스트링 화 연산자를 사용하려고합니다.

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

이 솔루션을 시도해보십시오.

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

이 질문에 어떻게 답하거나 도움이 되나요?
jirigracik

1
@jirigracik - 그것은 다른 답변과는 달리,뿐만 아니라 매크로 확장의 문자열 표현을 얻을 수 있습니다
grepcake

3
그냥있는 것만으로 QUDI(x)는 충분하지 않은 이유를 설명하는 것이 유용 할 것 같습니다 .
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

나는 완전히 확실하지 않지만 "Hello" #x"(그리고 #x "Hello") 문자열이 공백없이 함께 붙어있는 것처럼 보이 므로 어떤 경우에는 원하는 것이기 때문에 이것은 상당히 좋은 대답입니다.
Smar

1
@Smar 상수 문자열 뒤에 공백을 넣어야합니다. Hello : "Hello " #x
jack

좋아요, 그렇게 생각했습니다. 귀중한 정보이므로 답변을 수정해야합니다. :)
Smar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.