首页  >  文章  >  后端开发  >  为什么 MSVC 将 VA_ARGS 视为可变参数宏扩展中的单个参数,以及如何解决这个问题?

为什么 MSVC 将 VA_ARGS 视为可变参数宏扩展中的单个参数,以及如何解决这个问题?

Patricia Arquette
Patricia Arquette原创
2024-11-05 14:29:02556浏览

Why does MSVC   treat VA_ARGS as a single argument in variadic macro expansion, and how can this be worked around?

MSVC 中的可变宏扩展

在 C 编程领域,宏提供了一种定义可重用代码片段的便捷方法。然而,当在 Microsoft 的 Visual C (MSVC) 编译器中探索可变参数宏时,可能会出现障碍。本文深入研究了开发人员提出的问题,并提出了一种解决方法,以启用类似于 GCC 中的可变参数宏扩展。

问题陈述

当前的问题涉及到一个在 GCC 中完美扩展但在 MSVC 中遇到困难的宏。具体来说,该宏通过将所有 VA_ARGS (变量参数)视为单个参数而发生故障。以下是问题代码的摘录:

<code class="cpp">#define VA_NARGS_IMPL(__1, __2, __3, __4, __5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)</code>

该宏旨在计算传递给它的参数数量。但是,MSVC 错误地将所有 VA_ARGS 解释为一个参数,导致计数不正确。

解决方法

虽然询问者寻求一种复制技术为了满足 MSVC 中 GCC 的期望行为,Jeff Walden 在源线程中提出了一个出色的解决方案。此解决方法需要为每个可变参数宏声明一个辅助宏,如下所示:

<code class="cpp">#define FOO_CHOOSE_HELPER1(macro, count, ...) macro##count(__VA_ARGS__)
#define FOO_CHOOSE_HELPER2(macro, count, ...) FOO_CHOOSE_HELPER1(macro, count)
#define FOO(...) FOO_CHOOSE_HELPER2(FOO, COUNT_ARGS(__VA_ARGS__), __VA_ARGS__)</code>

COUNT_ARGS 宏用于确定传递给可变参数宏 FOO 的参数数量,辅助宏 FOO_CHOOSE_HELPER1和 FOO_CHOOSE_HELPER2 根据参数计数选择适当的 FOO 重载。

结论

虽然该解决方法有效解决了 MSVC 中的可变宏扩展问题,但它需要声明每个可变参数宏都有一个辅助宏,这对于大型代码库来说可能会变得很麻烦。尽管如此,它为那些在 MSVC 项目中遇到类似挑战的人提供了一个可行的解决方案。

以上是为什么 MSVC 将 VA_ARGS 视为可变参数宏扩展中的单个参数,以及如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn