据我所知,在 gcc 中你可以这样写:

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

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

有帮助吗?

解决方案

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

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

完整的参考是 这里.

其他提示

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

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

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

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

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

#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));

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

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

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

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

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif

以下应该有效。(参见链接 可变参数宏)

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

#  define DBGPRINTF(fmt,...) \
    do { \
        printf(fmt, __VA_ARGS__); \
    } while(0)

搜索 ”VA_ARGS” 和 MSDN 中的 va_list!

几乎。但它比那更难看(并且您可能不希望宏本身中有尾随分号:

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

使用方法:

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

(缺少一对括号)。

不知道为什么所有的负面影响,最初的问题没有说明 VC++ 的版本,并且并非所有编译器都支持可变参数宏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top