有没有办法在 Visual C++ 中编写带有变量参数列表的宏?
据我所知,在 gcc 中你可以写这样的东西:
#define DBGPRINT(fmt...) printf(fmt);
Is there a way to do that in VC++?
As far as I know, in gcc you can write something like:
#define DBGPRINT(fmt...) printf(fmt);
Is there a way to do that in VC++?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
如果您实际上不需要宏的任何功能(
__FILE__
、__LINE__
、标记粘贴等),您可能需要考虑使用 < 编写可变参数函数代码>stdargs.h。 可变参数函数可以调用vprintf()
来传递可变参数列表,而不是调用printf()
。If you don't actually need any of the features of macros (
__FILE__
,__LINE__
, token-pasting, etc.) you may want to consider writing a variadic function usingstdargs.h
. Instead of callingprintf()
, a variadic function can callvprintf()
in order to pass along variable argument lists.对于 MSVC 7.1 (.NET 2003),这有效:
For MSVC 7.1 (.NET 2003), this works:
以下应该有效。 (请参阅 可变参数宏 的链接)
(示例下面显示了固定参数和可变参数。)
The following should work. (See link to Variadic macros)
(Example below shows a fixed and variable arguments.)
在 MSDN 中搜索“VA_ARGS”和 va_list!
Search for "VA_ARGS" and va_list in MSDN!
几乎。 但它比那更难看(而且你可能不希望宏本身中有一个尾随分号:
要使用它:(
缺少一对括号)。
不知道为什么所有的负面因素,最初的问题没有说明VC++ 的一个版本,并且并非所有编译器都支持可变参数宏。
Almost. It's uglier than that though (and you probably don't want a trailing semi-colon in the macro itself:
To use it:
(was missing a pair of parens).
Not sure why all the negatives, the original question didn't state a version of VC++, and variadic macros aren't supported by all compilers.
是的,但仅从 VC++ 2005 开始。示例的语法为:
完整参考为 这里。
Yes but only since VC++ 2005. The syntax for your example would be:
A full reference is here.
是的,您可以在 Visual Studio C++ 2005 及更高版本中执行此操作(不确定 VS 2003)。 看一下VA_ARGS。 你基本上可以做这样的事情:
宏的变量参数将传递给作为“...”参数提供的函数,然后你可以使用 va_args 来解析它们。
VA_ARGS 和宏的使用可能会出现奇怪的行为。 因为 VA_ARGS 是可变的,这意味着可以有 0 个参数。 这可能会在您不希望的地方留下尾随逗号。
Yes, you can do this in Visual Studio C++ in versions 2005 and beyond (not sure about VS 2003). Take a look at VA_ARGS. You can basically do something like this:
and the variable arguments to the macro will get passed to the function provided as '...' args, where you can then us va_args to parse them out.
There can be weird behavior with VA_ARGS and the use of macros. Because VA_ARGS is variable, that means that there can be 0 arguments. That might leave you with trailing commas where you didn't intend.
如果您不想使用非标准扩展,则必须提供额外的括号:
If you do not want to use non-standard extensions, you've to provide extra brackets:
您正在寻找的内容称为[可变宏](http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)。
链接摘要:是的,从 VC++ 2005 开始。
What you're looking for are called [variadic macros](http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx).
Summary of the link: yes, from VC++ 2005 on up.