簡體   English   中英

打印宏的名稱和值

[英]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

希望您在所有源文件中都擁有相同的定義集。
否則,重新檢查定義的策略是明智的。


自動生成此功能
您可以使用M4宏語言(實際上甚至是AWK腳本 )。
M4成為您的預處理器。

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM