有没有一种方法可以在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()