有没有一种方法可以在Visual C ++中编写带有可变参数列表的宏?
时间:2020-03-05 18:54:05 来源:igfitidea点击:
据我所知,在gcc中,我们可以编写如下内容:
#define DBGPRINT(fmt...) printf(fmt);
有没有办法在VC ++中做到这一点?
解决方案
回答
几乎。但是,它比这更丑陋(而且我们可能不希望宏本身中包含尾随的分号:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
要使用它:
DBGPRINT(("%s\n", "Hello World"));
(缺少一对括号)。
不知道为什么所有的否定词,最初的问题都没有说明VC ++的版本,并不是所有编译器都支持可变参数宏。
回答
是的,我们可以在2005及更高版本的Visual Studio C ++中执行此操作(不确定VS 2003)。看一下VA_ARGS。我们基本上可以执行以下操作:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
宏的变量参数将传递给以'...'args提供的函数,然后我们可以在其中使用va_args解析它们。
VA_ARGS和使用宏可能会有奇怪的行为。由于VA_ARGS是可变的,因此意味着可以有0个参数。这可能会在我们不想要的地方留下逗号结尾。
回答
我们要查找的内容称为可变宏。
链接摘要:是的,从VC ++ 2005起。
回答
以下应该工作。 (请参见可变参数宏的链接)
(下面的示例显示固定和可变参数。)
# define DBGPRINTF(fmt,...) \ do { \ printf(fmt, __VA_ARGS__); \ } while(0)
回答
是的,但仅从VC ++ 2005开始。示例的语法为:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
完整的参考资料在这里。
回答
在MSDN中搜索" VA_ARGS"和va_list!
回答
如果我们不想使用非标准扩展名,则必须提供额外的括号:
#define DBGPRINT(args) printf(args); DBGPRINT(("%s\n", "Hello World"));
回答
如果我们实际上不需要任何宏功能(FILE ,LINE,令牌粘贴等),则可以考虑使用stdargs.h编写可变参数函数。可变参数函数可以调用vprintf()
来传递变量参数列表,而不是调用printf()
。