有没有办法在 Visual C++ 中编写带有变量参数列表的宏?

发布于 2024-07-05 07:55:39 字数 137 浏览 10 评论 0原文

据我所知,在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

感性不性感 2024-07-12 07:55:39

如果您实际上不需要宏的任何功能(__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 using stdargs.h. Instead of calling printf(), a variadic function can call vprintf() in order to pass along variable argument lists.

怎言笑 2024-07-12 07:55:39

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

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

For MSVC 7.1 (.NET 2003), this works:

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
假情假意假温柔 2024-07-12 07:55:39

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

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

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

The following should work. (See link to Variadic macros)

(Example below shows a fixed and variable arguments.)

#  define DBGPRINTF(fmt,...) \
    do { \
        printf(fmt, __VA_ARGS__); \
    } while(0)
梦里的微风 2024-07-12 07:55:39

在 MSDN 中搜索“VA_ARGS”和 va_list!

Search for "VA_ARGS" and va_list in MSDN!

我三岁 2024-07-12 07:55:39

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

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

要使用它:(

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

缺少一对括号)。

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

Almost. It's uglier than that though (and you probably don't want a trailing semi-colon in the macro itself:

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

To use it:

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

(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.

枯叶蝶 2024-07-12 07:55:39

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

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

完整参考为 这里

Yes but only since VC++ 2005. The syntax for your example would be:

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

A full reference is here.

坦然微笑 2024-07-12 07:55:39

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

#define DBGPRINTF(fmt, ...)  printf(fmt, __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:

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

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.

甲如呢乙后呢 2024-07-12 07:55:39

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

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

If you do not want to use non-standard extensions, you've to provide extra brackets:

#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
沧笙踏歌 2024-07-12 07:55:39

您正在寻找的内容称为[可变宏](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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文