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

标签 visual-c++ macros preprocessor variadic-macros

在 Visual Studio 2005 上,我有一个看起来像这样的宏(示例!!):

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

只要函数至少接受一个参数,我就没事。

当函数采用零参数时,预处理器“有帮助地”删除“尾随逗号”,展开如下所示:
if(prepare(x y)) { funct(); }

很棒,不是吗?

我怎样才能修复这个宏,以便它可以使用零 __VA_ARGS__在 Visual C++ (VS 2005) 上?

显然 this is a bug in VS2005 .

最佳答案

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

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

使用 gcc 4.2,两者 {0,}{0}在那种情况下是允许的,所以如果逗号被删除了也没关系。但是,我不确定这是否被规范、普遍实现的扩展或特定于 gcc 的东西普遍接受。

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

关于visual-c++ - 是否可以防止在 Visual C++ 中删除带有空 __VA_ARGS__ 的逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103824/

相关文章:

c - 如何编写一些代码来判断变量是否有符号

python - 从 python 调用宏时如何停止弹出

html - 防止 Prepos 处理某些 scss 文件?

C预处理器: declare structure data from a given enum value

android - Android.mk 中的预处理器宏被忽略,但在 Application.mk 中有效

c++ - 为什么这个令人困惑的#include"..\..\[etc. etc.]"语句可以工作?

windows - 如何从 Visual C++ 应用程序执行另一个程序

c++ - VC++,与 wxWidgets 链接错误,x64

c++ - stdafx.h 的目的

c - 为什么 UEFI 协议(protocol)头文件为单个协议(protocol) GUID 定义宏和外部全局变量?