2012-03-14 43 views
22

值到目前爲止,我已經儘量了:如何顯示的#define在編譯時在GCC

#define ADEFINE "23" 
#pragma message ("ADEFINE" 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 – 2012-03-14 01:29:58

+4

@JohnLawrenceAspden我更新瞭如何在沒有提升(或任何其他庫)的情況下做出答案。 – rob05c 2012-03-14 01:46:26

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