16

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

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

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

4

9 回答 9

24

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

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

完整的参考资料在这里

于 2008-09-15T17:51:32.450 回答
4

是的,您可以在 2005 及更高版本的 Visual Studio C++ 中执行此操作(不确定 VS 2003)。看看VA_ARGS。你基本上可以做这样的事情:

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

并且宏的变量参数将传递给作为“...”参数提供的函数,然后您可以在其中使用 va_args 将它们解析出来。

VA_ARGS和宏的使用可能会出现奇怪的行为。因为VA_ARGS是可变的,这意味着可以有 0 个参数。这可能会在您不想要的地方留下逗号。

于 2008-09-15T17:48:29.743 回答
4

如果您不想使用非标准扩展,则必须提供额外的括号:

#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
于 2008-09-15T18:22:31.923 回答
1

您要查找的内容称为 [可变参数宏]( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)

链接摘要:是的,从 VC++ 2005 开始。

于 2008-09-15T17:48:53.143 回答
1

如果您实际上不需要宏的任何功能(__FILE__、、__LINE__标记粘贴等),您可能需要考虑使用stdargs.h. 除了调用printf(),可变参数函数可以调用vprintf()以传递可变参数列表。

于 2008-09-16T03:23:51.530 回答
1

对于 MSVC 7.1 (.NET 2003),这有效:

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
于 2013-05-03T18:57:17.297 回答
0

以下应该工作。(参见可变参数宏的链接)

(下面的示例显示了固定和可变参数。)

#  define DBGPRINTF(fmt,...) \
    do { \
        printf(fmt, __VA_ARGS__); \
    } while(0)
于 2008-09-15T17:49:45.713 回答
0

在 MSDN 中搜索“ VA_ARGS ”和 va_list!

于 2008-09-15T17:57:32.107 回答
-2

几乎。它比那更难看(而且你可能不希望宏本身的尾随分号:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'

要使用它:

DBGPRINT(("%s\n", "Hello World"));

(缺少一对括号)。

不知道为什么所有的否定,原始问题没有说明 VC++ 的版本,并且所有编译器都不支持可变参数宏。

于 2008-09-15T17:47:04.177 回答