据我所知,在 gcc 中,您可以编写如下内容:
#define DBGPRINT(fmt...) printf(fmt);
有没有办法在 VC++ 中做到这一点?
据我所知,在 gcc 中,您可以编写如下内容:
#define DBGPRINT(fmt...) printf(fmt);
有没有办法在 VC++ 中做到这一点?
是的,您可以在 2005 及更高版本的 Visual Studio C++ 中执行此操作(不确定 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)
在 MSDN 中搜索“ VA_ARGS ”和 va_list!
几乎。它比那更难看(而且你可能不希望宏本身的尾随分号:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
要使用它:
DBGPRINT(("%s\n", "Hello World"));
(缺少一对括号)。
不知道为什么所有的否定,原始问题没有说明 VC++ 的版本,并且所有编译器都不支持可变参数宏。