簡體   English   中英

宏內的宏擴展

[英]Macro expansion within a macro

我正在嘗試創建LOGDEBUG宏:

#ifdef DEBUG
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif

#define LOGDEBUG(...) do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG),  __VA_ARGS__); } while (0)

...

size_t haystack_len = fminl(max_haystack_len, strlen(haystack_start));
LOGDEBUG(("haystack_len %ld\n", haystack_len));

我沒有使用#或##參數來對參數進行字符串化,但是g ++顯然試圖對它們進行字符串化:

numexpr/interpreter.cpp:534:5: error: invalid conversion from ‘size_t {aka long unsigned int}’ to ‘const char*’ [-fpermissive]

注意, haystack_lensize_t ,我沒有在宏中將其轉換為char* ,但是編譯器認為是這樣。 g ++是否隱式嘗試將宏參數轉換為字符串?

如何解決? 我的意思是,我正在使用gnu LOG_MAKEPRI宏進行系統日志記錄,這可能是引起麻煩的宏嗎? 另外,有什么辦法可以看到宏擴展代碼?

如何解決?

LOGDEBUG(("haystack_len %ld\\n", haystack_len)); 用一個唯一的參數調用宏。 因此它將產生:

do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), ("haystack_len %ld\n", haystack_len)); } while (0);

並且("haystack_len %ld\\n", haystack_len)使用逗號運算符並導致haystack_len

因此,您必須這樣稱呼: LOGDEBUG("haystack_len %ld\\n", haystack_len);

另外,有什么辦法可以看到宏擴展代碼?

gcc -E可能有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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