內宏

2014-02-18 30 views
0

宏擴展我試圖創建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宏進行syslogging,難道這個宏可能會造成麻煩嗎?另外,有沒有辦法看到宏擴展的代碼?

+0

我想你在LOGDEBUG調用中有2個額外的括號。 (你只傳遞1個參數) – Jarod42

回答

1

如何解決這個問題?

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可能會有幫助。