2012-03-25 63 views
3

我想調試功能,宏是這樣的文字:使用符號的名稱作爲字符串中的#define功能的宏

int myVar = 5; 
PRINTVAR(myVar); // macro 

// which expands to something like... 
print("myVar: "); 
println(myVar); 

基本上,我想用標識符作爲一個字符串字面以及變量。

當我想將大量變量轉儲到標準輸出時,我只是感到有點反覆自己。

我傻嘗試,這當然不起作用:

#define PRINT_VAR(x) Serial.print("x: "); Serial.println(x); 

這可能嗎?

+2

你應該非常謹慎地在宏中嵌入分號。你當然無法使用你在任何地方寫的東西。通常,在宏調用之後會有一個分號,所以擴展在一行中會有兩個分號。它不是直接的語法錯誤,因爲第二個分號表示空語句的結束。考慮使用'do {Serial.print(「x:」); Serial.println(X); } while(0)'成語,如果你必須使用分號。請注意,至少有一個答案通過使用逗號運算符來小心避免分號。 – 2012-03-25 04:21:06

+0

@JonathanLeffler爲提示而歡呼!我注意到這些逗號,是有道理的。 – aaaidan 2012-03-25 04:35:39

回答

10

的「字符串化操作」是專爲正是這種情況:

#define PRINT_VAR(x) (print(#x ": "), println(x)) 
+0

哇,wth。爲什麼逗號在那裏工作?誰得到它?預處理器還是編譯器? – enigmaticPhysicist 2018-01-28 19:14:51

+0

@enigmaticPhysicist:C中的一個操作符是逗號操作符,其格式爲''。它評估左手錶情,然後有一個序列點(所有副作用都可以解決),然後評估右手錶情。運算符的結果和類型與右手錶達式的結果和類型相同。請注意,函數調用的參數列表中的逗號是* not *逗號運算符,它們只是標點符號。 – caf 2018-01-28 23:43:49

0

給你的代碼示例中,我不知道你在談論C或Java。然而,這裏是我用C做的事:

#define DEBUG(X, ...) fprintf(x, __VA_ARGS__); 

,並使用它:

DEBUG(srderr, 「我的錯誤。\ n」);

+0

我應該在問題中明確指出,在調試輸出時,我想避免輸入兩次變量名稱。是的,C是正確的!歡呼聲 – aaaidan 2012-03-25 04:25:11

2

查找stringifying operator,#,當您使用以此爲前綴的宏ID時,它將其作爲字符串放入,而不是展開它。

+0

輝煌。感謝您提供參考。 – aaaidan 2012-03-25 04:36:00

+0

恥辱電話編輯不會讓我嵌入鏈接或我會做得更好。有時間解決這個問題。 – gbjbaanb 2012-03-25 12:19:17