[英]Printing name and value of a macro
我有一個C程序,可以使用#define
s啟用或禁用許多優化。 當我運行我的程序時,我想知道在編譯時定義了哪些宏。
所以我試着編寫一個宏函數來打印宏的實際值。 像這樣的東西:
SHOW_DEFINE(X){\
if( IS_DEFINED(X) )\
printf("%s is defined and as the value %d\n", #X, (int)X);\
else\
printf("%s is not defined\n", #X);\
}
但是,我不知道如何使它工作,我懷疑這是不可能的,有沒有人知道如何做到這一點?
(請注意,即使未定義宏,也必須編譯!)
只要你願意忍受SOMESTRING = SOMESTRING指示尚未定義SOMESTRING的事實(查看它是因為令牌尚未重新定義!?!),那么以下內容應該:
#include <stdio.h>
#define STR(x) #x
#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x))
#define CHARLIE -6
#define FRED 1
#define HARRY FRED
#define NORBERT ON_HOLIDAY
#define WALLY
int main()
{
SHOW_DEFINE(BERT);
SHOW_DEFINE(CHARLIE);
SHOW_DEFINE(FRED);
SHOW_DEFINE(HARRY);
SHOW_DEFINE(NORBERT);
SHOW_DEFINE(WALLY);
return 0;
}
輸出是:
BERT=BERT
CHARLIE=-6
FRED=1
HARRY=1
NORBERT=ON_HOLIDAY
WALLY=
編寫擴展到另一個MACRO的MACRO將需要預處理器在其上運行兩次。
那是沒有做到的。
你可以寫一個簡單的文件,
// File check-defines.c
int printCompileTimeDefines()
{
#ifdef DEF1
printf ("defined : DEF1\n");
#else // DEF1
printf ("undefined: DEF1\n");
#endif // DEF1
// and so on...
}
在此文件上使用與其他文件相同的編譯時定義行。
在開始的某個時候調用該函數。
如果源文件中包含#DEFINE
行而不是Makefile
,
將它們移動到另一個Header
文件並在所有源文件中包含該標頭,
包括這個check-defines.c
。
希望您在所有源文件中都擁有相同的定義集。
否則,重新檢查定義的策略是明智的。
#ifdef MYMACRO
printf("MYMACRO defined: %d\r\n", MYMACRO);
#endif
我不認為你想要做的事情是可能的。 您在運行時詢問已在編譯之前處理的信息。 字符串“MYMACRO”在CPP將其擴展到程序內的值后意味着什么。
您沒有指定您使用的編譯器。 如果這是gcc, gcc -E可以幫助你,因為它在預處理階段后停止,並打印預處理結果。 如果你用原始文件區分gcc -E結果,你可能會得到你想要的一部分。
為什么不簡單地用預處理器測試呢?
#if defined(X)
printf("%s is defined and as the value %d\n", #X, (int)X);
#else
printf("%s is not defined\n", #X);
#endif
人們還可以將其嵌入到另一個測試中,而不是每次都打印它:
#if define(SHOW_DEFINE)
#if defined(X)
printf("%s is defined and as the value %d\n", #X, (int)X);
#else
printf("%s is not defined\n", #X);
#endif
#endif
來自boost的wave庫也可以幫助你做你想做的事情。 如果你的項目足夠大,我認為值得嘗試。 它是一個C ++預處理器,但它們是一樣的:)
我相信你想做的事情是不可能的。 如果你能夠改變#define
的工作方式,那么我建議這樣的事情:
#define ON 1
#define OFF 2
#define OPTIMIZE_FOO ON
#define OPTIMIZE_BAR OFF
#define SHOW_DEFINE(val)\
if(val == ON) printf(#val" is ON\n");\
else printf(#val" is OFF\n");
實際上不可能,問題是“未定義”部分。 如果您依靠宏值來激活/停用代碼的某些部分,那么您可以簡單地執行以下操作:
#define SHOW_DEFINE(X) \
do { \
if (X > 0) \
printf("%s %d\n", #X, (int)X); \
else \
printf("%s not defined\n", #X); \
} while(0)
根據Chrisharris的說法,回答我這樣做了。 雖然我的答案不是很好,但這完全是我想要的。
#define STR(x) #x
#define SHOW_DEFINE(x) printf("%s %s\n", #x, strcmp(STR(x),#x)!=0?"is defined":"is NOT defined")
只有我發現的錯誤是定義不能是#define XXX XXX(XXX等於XXX)。
這個問題與Macro非常接近, 它打印一個表達式並對其進行評估(使用__STRING) 。 Chrisharris的答案與上一個問題的答案非常接近。
你可以使用一個初始化為1的整數變量。將#define乘以這個變量並打印變量的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.