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中文网其他相关文章!