是否可以在 Visual C++ 中防止删除带有空 __VA_ARGS__ 的逗号?

发布于 2024-11-30 07:47:23 字数 555 浏览 0 评论 0原文

在 Visual Studio 2005 上,我有一个如下所示的宏(示例!!):

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/

只要该函数至少接受一个参数,就可以了。

当函数采用零参数时,预处理器“有效地”删除“尾随逗号”,扩展如下内容:

if(prepare(x y)) { funct(); }

太棒了,不是吗?

如何修复此宏,以便它可以在 Visual C++ (VS 2005) 上使用零 __VA_ARGS__


显然这是VS2005中的一个错误。

On Visual Studio 2005 I have a macro that looks like this (examplified!!):

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/

As long as the function takes at least one argument, I'm fine.

When the function takes zero arguments, the preprocessor "helpfully" removes the "trailing comma", expanding something like this:

if(prepare(x y)) { funct(); }

Great, isn't it?

How can I fix this macro, so that it'll work with zero __VA_ARGS__ on Visual C++ (VS 2005)?


Apparently this is a bug in VS2005.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

花落人断肠 2024-12-07 07:47:23

不幸的是,我不再使用 Visual C++(因此无法验证它是否有效),但是你能尝试一下吗?

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    int fail[] = {0,}     \
    FUN(__VA_ARGS__);     \
  }

使用 gcc 4.2,在该上下文中允许 {0,}{0},因此逗号是否被删除并不重要。然而,我不确定这是否在规范中被普遍接受,是一个普遍实现的扩展,还是特定于 gcc 的东西。

如果 Visual C++ 允许 {0,} 语法,那么这将有望解决您的问题(假设我正确理解 __VA_ARGS__< 之前的最新逗号) /code> 是被错误删除的内容,无论它出现在语法中的哪个位置)。

Unfortunately, I do not use Visual C++ anymore (and as so cannot verify this works), but can you try this?

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    int fail[] = {0,}     \
    FUN(__VA_ARGS__);     \
  }

Using gcc 4.2, both {0,} and {0} are allowed in that context, so if the comma gets deleted or not it would not matter. However, I am not certain whether that is generally accepted in the spec, a commonly implemented extension, or something specific to gcc.

If the {0,} syntax is allowed by Visual C++, then this would hopefully solve your problem (assuming I understand correctly that the most recent comma before __VA_ARGS__ is what is being incorrectly deleted, regardless of where it is appearing in the syntax).

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