岁月不饶人,这年纪大了记忆力真是差了不少。今天写程序须要用到可变参数的宏,但是忘了怎么写,这倒也没什么,由于我一贯是不记忆这些语法细节的,反正我知道程序里有个地方用到了这种技巧,可是可悲的是我忘了在哪一个地方。搜索?语法都忘了搜个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语言可变参数宏的文章浩如烟海,为何还要本身写一篇这种文档?那就是网上的文章虽然不少,可是参差不齐,找到篇文章看半天后,还得本身验证一下,实在是耗时耗力,而本身记录下来的,是已经在程序中实际使用,通过验证的代码,其正确性、可用性固然毋庸置疑,看了一眼立刻就能拿来用,省时省力,实在是个好办法。惟一的缺点就是要写文档,还要发表,有点麻烦,唉,那总也比处处翻代码强啊。