为什么这个可变参数计数宏会因VC++而失败?

Xeo*_*Xeo 17 c++ visual-studio-2010 visual-c++ c-preprocessor

我得到了以下实现来获取可变参数宏中的参数数量(目前限制为16个参数).但是,对于VS2010 1,无论传递多少个参数,输出总是如此.使用GCC,输出是正确的,让我得出结论,我必须错过MSVC特有的东西(10).

#define PP_NARGS(...) \
    _xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)

#define _xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...) N

int main(){
    int i = PP_NARGS(A,V,C,X,Y,Z);

    std::cout << i;

    std::cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,问题是标题所述,任何帮助将不胜感激.

Ise*_*ria 24

以下解决方案是否有帮助?

#define EXPAND(x) x
#define PP_NARGS(...) \
    EXPAND(_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
Run Code Online (Sandbox Code Playgroud)

我认为你的宏没有特别错,但MSVC的__VA_ARGS__扩展似乎与C99不同.

  • @IseWisteria @Xeo我在调查时遇到了类似的问题(http://stackoverflow.com/questions/38209120/invalid-argument-count-in-a-variadic-macro),我意识到`__VA_ARGS__`是扩展*之后*它们被传递到宏中.在你的情况下,`x1`作为一个整体变成'A,V,C,X,Y,Z`.`EXPAND`技巧迫使它更早扩展. (2认同)