歲月不饒人,這年紀大了記憶力真是差了不少。今天寫程序須要用到可變參數的宏,但是忘了怎麼寫,這倒也沒什麼,由於我一貫是不記憶這些語法細節的,反正我知道程序裏有個地方用到了這種技巧,可是可悲的是我忘了在哪一個地方。搜索?語法都忘了搜個P呀。只好憑着印象,在本身負責的模塊代碼中找了一圈,花了十幾分鍾才終於在日誌模塊找到。唉,看來仍是寫下來比較好,這記憶力實在是不能相信了。ide
C語言中,可變參數宏的寫法有以下幾種形式:spa
#define myprint_1(fmt, ...) printf(fmt, __VA_ARGS__)日誌 #define myprint_2(fmt, ...) printf(fmt, ##__VA_ARGS__)orm #define myprint_3(fmt, arg...) printf(fmt, ##arg)ci
int main(void)文檔 {it myprint_1("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);編譯 myprint_2("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);table myprint_3("%s, %s, %d\r\n", __FILE__, __FUNCTION__, __LINE__);ast return 0; } |
注意:上面的三種形式在Windows+MinGW+GCC下編譯經過,可使用,可是在Tornado 2.2+VxWorks 6.5下,前面兩種形式編譯會出錯,只有最後一種是可用的。
說實話,網上關於C語言可變參數宏的文章浩如煙海,爲何還要本身寫一篇這種文檔?那就是網上的文章雖然不少,可是參差不齊,找到篇文章看半天后,還得本身驗證一下,實在是耗時耗力,而本身記錄下來的,是已經在程序中實際使用,通過驗證的代碼,其正確性、可用性固然毋庸置疑,看了一眼立刻就能拿來用,省時省力,實在是個好辦法。惟一的缺點就是要寫文檔,還要發表,有點麻煩,唉,那總也比處處翻代碼強啊。