问题标签 [variadic-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
16363 浏览

c++ - 有没有办法在 Visual C++ 中编写带有变量参数列表的宏?

据我所知,在 gcc 中,您可以编写如下内容:

有没有办法在 VC++ 中做到这一点?

0 投票
12 回答
145917 浏览

c++ - C++ 预处理器 __VA_ARGS__ 参数数量

我在网上找不到答案的简单问题。在可变参数宏中,如何找到参数的数量?如果有解决方案,我可以使用 boost 预处理器。

如果它有所作为,我正在尝试将可变数量的宏参数转换为提升预处理器序列、列表或数组以进行进一步的重新处理。

0 投票
3 回答
7191 浏览

c++ - 向可变参数宏添加默认参数

是否可以在可变参数宏中的变量参数之前添加默认参数?例如,我有类似的宏版本

我想在变量参数之前在宏中添加另外 2 个默认参数,这样它就不会影响以前的版本。喜欢:

任何帮助,将不胜感激。

0 投票
1 回答
437 浏览

c++ - 宏定义中的参数数量

我有一些模板化函数,由于模板类型,它具有不同数量的参数。这个函数是用宏定义包装的。

当我只使用一个参数进行函数调用时,一切都很好,但我需要更多。我查看了 boost 它通过定义不同的宏来完成这些事情,如下所示:

但是此代码标记为可移植的编译器。有办法使用带有任意数量参数的一些定义。我怎样才能做到这一点?

0 投票
1 回答
6231 浏览

macros - C Preprocessor, Macro "Overloading"

I'm trying to do some kind of Macro "Overloading", so that MACRO(something), gets expanded differently than MACRO(something, else).

Using a snippet I got from here (I'm not sure if it's 100% portable) and some functions from the Boost PP Library, I was able to make it work :D

Now I'm still missing two other things that I want to do:

  1. (This one I don't really care if I never solve it) I believe that a MACRO can be written that when taking up the number of 'variants' and its correspondent 'output' generates a code similar like the one above. Something like TEMPLATE(3, function_A(...), function_B(...), function_C(...)) to generate the example above.

  2. What happens when TEST() is called without arguments? Well, VA_NARGS expands to 1. But the first argument is ""(nothing). I'm trying to find a way to either detect 'zero' arguments in __VA_ARGS__ or to differentiate between a 'null' argument and a real one, in order to extend the 'overloading' function to react to this situation. Any ideas?

0 投票
3 回答
5526 浏览

c++ - 具有零参数和逗号的可变参数宏

考虑这个宏:

当与零参数一起使用时,它会产生错误的代码,因为编译器需要逗号后的标识符。实际上,VC 的预处理器足够聪明,可以删除逗号,但 GCC 的则不然。由于不能重载宏,因此似乎需要一个单独的宏才能使这种特殊情况正确,如下所示:

有什么方法可以在不引入第二个宏的情况下使其工作?

0 投票
3 回答
1876 浏览

c - C中的令牌粘贴

在阅读了关于VA_NARG之后

我尝试使用宏根据C中的参数数量来实现函数重载。现在的问题是:

我从 C-faq中读到了这个。但仍然无法让它工作......

0 投票
2 回答
12631 浏览

c - 我可以用 __VA_ARGS 在中间而不是结尾来定义可变参数 C 预处理器宏吗?

如果我这样做,GCC 会抱怨:

给我这两个理由:

显然,C99 风格的可变参数宏期望在省略号之后立即有右括号,有效地要求可变参数列表是宏的最后一个参数。我需要它位于中间以生成上述宏中描述的速记符号。GCC 是否支持此功能,使用另一种(非 C99)可变参数宏样式?我可以以其他方式模仿它吗?我不希望最后的可变参数列表,它会使我的符号混乱。而且我只能使用GCC。

0 投票
3 回答
9332 浏览

c - 附加到 __VA_ARGS__

我知道我可以这样做:

这只是一个示例,它是更复杂解决方案的一部分。关键是我需要将可变数量的参数附加到前 123 个参数中。如果没有将参数传递给 MACRO,## 会使编译器在 123 参数之后去掉逗号。

但现在我想将参数附加到 api,如下所示:

诺坎多。一种解决方案是使用两个宏,例如 MACRO 和 MACRO_V,并使 _V 版本不处理任何参数。但是有没有办法让它与一个宏一起工作?

0 投票
3 回答
2343 浏览

c - C中可变参数宏的问题

我在C中的 #define 语句中的可选参数有问题,或者更具体地说是 gcc 4.2:

这显然是一个人为的例子,但确实显示了问题。有谁知道我怎样才能正确获得“解决”的可选参数?


附加信息:如果我删除##before __VA_ARGS__,并执行以下操作:

编译,但它不再适用于零参数,因为它会解析为func(tmp, )

编辑:在将我的所有代码转换为依赖 P99 而不是我之前的代码之后(这最终大大破坏了我的代码,哎呀),我意外地发现这有效:

编译并使用任意数量的参数(并且传入和返回正确的值),但是......这应该是合法的吗?