[英]is there a way to write macros with a variable argument list in visual C++?
据我所知,在 gcc 中,您可以编写如下内容:
#define DBGPRINT(fmt...) printf(fmt);
有没有办法在 VC++ 中做到这一点?
是的,您可以在 2005 及更高版本的 Visual Studio C++ 中执行此操作(不确定 VS 2003)。 看看VA_ARGS 。 你基本上可以做这样的事情:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
并且宏的变量 arguments 将传递给作为“...”参数提供的 function,然后您可以在其中使用 va_args 将它们解析出来。
VA_ARGS和宏的使用可能会出现奇怪的行为。 因为VA_ARGS是可变的,这意味着可以有 0 arguments。 这可能会在您不想要的地方留下逗号。
如果您不想使用非标准扩展,则必须提供额外的括号:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
对于 MSVC 7.1 (.NET 2003),这有效:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
您要查找的内容称为 [可变参数宏]( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx) 。
链接摘要:是的,从 VC++ 2005 开始。
如果您实际上不需要宏的任何功能( __FILE__
、 __LINE__
、标记粘贴等),您可能需要考虑使用stdargs.h
。 而不是调用printf()
,可变参数 function 可以调用vprintf()
以传递变量参数列表。
以下应该工作。 (参见可变参数宏的链接)
(下面的示例显示了固定和可变 arguments。)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
在 MSDN 中搜索“ VA_ARGS ”和 va_list!
几乎。 它比那更难看(而且你可能不希望宏本身的尾随分号:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
要使用它:
DBGPRINT(("%s\n", "Hello World"));
(缺少一对括号)。
不知道为什么所有的否定,原始问题没有 state 一个版本的 VC++,并且所有编译器都不支持可变参数宏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.