2015-02-08 69 views
0

我有這樣的代碼:的#define宏不打印變量

#define PRINT(fmt, ...) printf("%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__) 

它運作良好,當我通過一定的參考價值的,例如PRINT("Hello, world"). 但是當我通過變量作爲自變量,例如。 PRINT(somevar)它不打印變量int somevar的值。我應該如何重寫宏以使其打印變量呢?

+0

你的意思是我最好重寫它作爲一個傳統的例程,並使用va_list? – cwenz1980 2015-02-08 05:17:38

+1

宏將不工作,除非宏的'fmt'(第一個)參數可以與'「%s:%d:」'字符串連接,這意味着它也必須是文字。要打印'int somevar',宏調用必須是'PRINT(「%d \ n」,somevar);'。 – 2015-02-08 05:20:44

+0

簡而言之,你不能像'printf(some_int_var)'那樣調用'printf';一個格式字符串是需要的。這是沒有什麼不同的(事實上它是強制性的,因爲你的邏輯現在要求它可以連接,並且計算格式字符串不可行,公正的警告)。發送到這裏的唯一直接就像'printf','char *'(const或其他)本身一樣,就像'printf'一樣,出於安全的原因將不鼓勵。 – WhozCraig 2015-02-08 05:28:03

回答

3

問題不在宏中。這是你如何使用它。從本質上講,您的使用要求您使用PRINT格式字符串,該格式字符串必須是描述如何處理後續參數的字符串文字。

例如,嘗試

PRINT("x = %d y = %d\n", x, y); 

其中xyint類型的變量。

+0

@Jonathan Leffler和Rob。了不起!!你很快就解決了我的問題! – cwenz1980 2015-02-08 05:29:48