有没有办法在 Visual C++ 中编写带有变量参数列表的宏?
-
09-06-2019 - |
题
据我所知,在 gcc 中你可以这样写:
#define DBGPRINT(fmt...) printf(fmt);
在VC++中有没有办法做到这一点?
解决方案
其他提示
是的,您可以在 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++ 的版本,并且并非所有编译器都支持可变参数宏。
不隶属于 StackOverflow