本文說的__VA_ARGS__,就是一個可變參數宏,與printf中可變參數的宏定義一個道理,是新C99規范中增加的。
__VA_ARGS__詳情內容
1.關於__VA_ARGS__
__VA_ARGS__它是一個可變參數的宏,就是將左邊宏中“...” 的內容原樣抄寫在右邊 __VA_ARGS__ 所在的位置。
要注意的是,printf 的輸出格式是括號內左邊是字符串,右邊是變量,而且右變量與左輸出格式是一一對應的,不對應就會出錯。可以參看下面那個例子, __VA_ARGS__其實是遵循了printf的格式。
...缺省號代表一個可以變化的參數表。使用保留名 __VA_ARGS__ 把參數傳遞給宏。當宏的調用展開時,實際的參數就傳遞給 printf()了。
2.實例說明
#define SENSOR_Printf(...) printf("--SENSOR--"__VA_ARGS__)
int TemperatureVal = 25;
SENSOR_Printf("溫度 = %d℃\n", TemperatureVal);
輸出結果:
--SENSOR--溫度 = 25℃
用心的朋友可能會猜測的到:“...”類似等於“__VA_ARGS__”。
從例子中我們可以看得出來,__VA_ARGS__的用途,主要是用於可變參數的函數。我們使用較多的printf就是最常見的一個。
如果我們的工程很龐大,我們就可以將打印信息分類,這樣的好處就是方便我們識別各類打印信息。
我自己在項目中使用的方法如下:
#define _MSG_DBG(...) SEGGER_RTT_printf(0, __VA_ARGS__); //RTT打印
如果不想打印,就使用下面的:
#define _MSG_DBG(...)
即可
參考了