繁体   English   中英

有没有办法在可视 C++ 中编写带有可变参数列表的宏?

[英]is there a way to write macros with a variable argument list in visual C++?

据我所知,在 gcc 中,您可以编写如下内容:

#define DBGPRINT(fmt...) printf(fmt);

有没有办法在 VC++ 中做到这一点?

是的,但仅从 VC++ 2005 开始。您示例的语法为:

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)

完整的参考资料在这里

是的,您可以在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM