回答
这是一个variadic macro。
从链接页面引用逐字:
宏可以声明为接受可变数量的参数就像一个功能。定义宏的语法与函数的语法相似。下面是一个例子:
#define eprintf(...) fprintf (stderr, __VA_ARGS__)
这种宏叫做variadic。当宏被调用时,其最后命名参数(该宏没有)后的参数列表中的所有标记(包括任何逗号)都将成为变量参数。无论它出现在哪里,这个令牌序列都会替换标识符为的VA_ARGS。因此,我们有这样的扩展:
eprintf ("%s:%d: ", input_file, lineno) ==> fprintf (stderr, "%s:%d: ", input_file, lineno)
而对于特定的形式,引用的页面进一步下跌:
如果宏是复杂的,你可能要为一个更具描述性的名称可变参数比
__VA_ARGS__
。 CPP允许这样做,作为扩展。你可以在`...'之前立即写出一个参数名称;该名称用于可变参数。该EPRINTF宏观上面可以写#define eprintf(args...) fprintf (stderr, args)
可变数量的参数。见variadic macros
但为何有一个“一”在那里,“......”过吗? – perfwill 2012-01-27 10:17:38
@perfwill,这是为了方便起见,给它一个名字的语法。 – 2012-01-27 10:19:01
这是一个可变参数宏。
可变参数宏是一个接受可变数量参数的宏。该功能已在C99中引入。
形式
#define IDEBUG(a...) printf(a)
与参数a...
是GNU扩展,a
给出一个名称__VA_ARGS__
标识符。
C99标准形式是
#define IDEDBUG(...) printf(__VA_ARGS__)
- 1. 这个javascript语法是什么意思?
- 2. 这个Scala语法是什么意思(_ *)?
- 3. 这个C++语法是什么意思?
- 4. 这个python语法是什么意思?
- 5. 这个语法是什么意思?
- 6. 这个语法是什么意思? new {}
- 7. 这个语法是什么意思。 (:: *)
- 8. 这个“新”语法是什么意思?
- 9. 这个Java语法是什么意思?
- 10. 这个rails语法是什么意思?
- 11. jQuery - 这个语法是什么意思?
- 12. 这个语法是什么意思? (Prolog)
- 13. C++,这个语法是什么意思?
- 14. 这个PHP语法是什么意思?
- 15. 这个python语法是什么意思?
- 16. 这ocaml语法是什么意思?
- 17. 这个JS语法是什么意思,什么是'长度'?
- 18. 这个Perl语句是什么意思?
- 19. 这个MATLAB语句是什么意思?
- 20. 这个shell语句是什么意思?
- 21. 这个Javascript语句是什么意思?
- 22. 这个mysql语句是什么意思?
- 23. 这个Python语句是什么意思?
- 24. 这个“if”语句是什么意思?
- 25. 这个php语句是什么意思?
- 26. 这个C++语句是什么意思?
- 27. 这个Java语句是什么意思?
- 28. 这个C习语是什么意思?
- 29. “::”语法是什么意思?
- 30. 混淆deque的语法。这个语法是什么意思?
很棒的答案,+1和一个勾号:D – perfwill 2012-01-27 10:19:25