2012-03-14 2 views
22

에서 컴파일시에 정의 #의 값을 표시 할 지금까지 나는 지금까지와 같은있어 : 작동하지만, ADEFINE 문자열이 무엇을하지 않은 경우어떻게 GCC

#define ADEFINE "23" 
#pragma message ("ADEFINE" ADEFINE) 

?

#define ADEFINE 23 
#pragma message ("ADEFINE" ADEFINE) 

원인 :

경고 : 잘못된 '의 #pragma 메시지',

무시는 이상적으로는 정의를 포함한 모든 값을 처리 할 수 ​​있도록하고 싶습니다.

답변

22

이 문자열이 아닌 매크로를 표시하려면, stringify the macro :

#define STRINGIFY(s) XSTRINGIFY(s) 
#define XSTRINGIFY(s) #s 

#define ADEFINE 23 
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

boost을 원한다면 boost stringize을 사용하면됩니다.

#include <boost/preprocessor/stringize.hpp> 
#define ADEFINE 23 
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
+0

글쎄, 내 클라이언트가 종속성으로 추가 된 것을 매우 기쁘게 생각하지 않는다고 생각하지만, 그것은 실존 증명처럼 보입니다. 아마도 나는 stringize.hpp를보아야 만한다. –

+4

@JohnLawrenceAspden 나는 boost (또는 다른 라이브러리)없이 그것을하는 방법으로 답을 업데이트했다. – rob05c

6

이것이 원하는지는 모르겠지만, 가끔 매크로 문제를 디버깅하는 데만 관심이있는 경우 (각 컴파일마다 메시지에 표시해야하는 내용이 아님) 당신을 위해 일할 수도 있습니다. gcc의 -E -dD 옵션을 사용하여 사전 처리 출력과 함께 #define 지시어를 덤프 할 수 있습니다. grep를 통해서만 라인을 볼 수있는 그런 파이프는 당신이 원하는 :

// test.c 
#include <stdlib.h> 
#include <stdio.h> 
#define ADEFINE "23" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
#undef ADEFINE 
#define ADEFINE 42 
    return 0; 
} 

명령 gcc -E -dD -c test.c | grep ADEFINE 쇼 :

#define ADEFINE "23" 
#undef ADEFINE 
#define ADEFINE 42