gpt4 book ai didi

c++ - 用于 Visual Studio 的零参数参数计数宏

转载 作者:太空狗 更新时间:2023-10-29 19:58:03 25 4
gpt4 key购买 nike

gcc 确实支持带有零参数的参数计数宏,使用 ## __VA_ARGS__ 约定。以下是用gcc编译的作品:

#include <stdio.h>

#define NARGS(...) __NARGS(0, ## __VA_ARGS__, 5,4,3,2,1,0)
#define __NARGS(_0,_1,_2,_3,_4,_5,N,...) N

int main()
{
printf("%d\n", NARGS()); // prints 0
printf("%d\n", NARGS(1)); // prints 1
printf("%d\n", NARGS(1, 2)); // prints 2
return 0;
}

是否有适用于零参数宏的 VisualC++ 等效项?接受非标准扩展或技巧。

编辑:修复示例以使用 GCC 扩展和 C++ 编译器。

最佳答案

以下示例在启用了非标准扩展的 VisualStudio 2010 和更新版本、gcc 和 clang 中运行良好。在 Microsoft 编译器中,它假设当参数计数为零时,预处理器将删除 AUGMENTER 宏中的尾随逗号。这是非标准的,其他地方也有报道。在 gcc 和 clang 中,它使用广为人知的 ## __VA_ARGS__ 非标准扩展。

#include <stdio.h>

#ifdef _MSC_VER // Microsoft compilers

#define EXPAND(x) x
#define __NARGS(_1, _2, _3, _4, _5, VAL, ...) VAL
#define NARGS_1(...) EXPAND(__NARGS(__VA_ARGS__, 4, 3, 2, 1, 0))

#define AUGMENTER(...) unused, __VA_ARGS__
#define NARGS(...) NARGS_1(AUGMENTER(__VA_ARGS__))

#else // Others

#define NARGS(...) __NARGS(0, ## __VA_ARGS__, 5,4,3,2,1,0)
#define __NARGS(_0,_1,_2,_3,_4,_5,N,...) N

#endif

int main()
{
// NARGS
printf("%d\n", NARGS()); // Prints 0
printf("%d\n", NARGS(1)); // Prints 1
printf("%d\n", NARGS(1, 2)); // Prints 2
fflush(stdout);

#ifdef _MSC_VER
// NARGS minus 1
printf("\n");
printf("%d\n", NARGS_1(1)); // Prints 0
printf("%d\n", NARGS_1(1, 2)); // Prints 1
printf("%d\n", NARGS_1(1, 2, 3)); // Prints 2
#endif

return 0;
}

宏已使用真实编译器进行测试,WandboxWebcompiler

关于c++ - 用于 Visual Studio 的零参数参数计数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com