问题标签 [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.
c++ - 有没有办法在 Visual C++ 中编写带有变量参数列表的宏?
据我所知,在 gcc 中,您可以编写如下内容:
有没有办法在 VC++ 中做到这一点?
c++ - C++ 预处理器 __VA_ARGS__ 参数数量
我在网上找不到答案的简单问题。在可变参数宏中,如何找到参数的数量?如果有解决方案,我可以使用 boost 预处理器。
如果它有所作为,我正在尝试将可变数量的宏参数转换为提升预处理器序列、列表或数组以进行进一步的重新处理。
c++ - 向可变参数宏添加默认参数
是否可以在可变参数宏中的变量参数之前添加默认参数?例如,我有类似的宏版本
我想在变量参数之前在宏中添加另外 2 个默认参数,这样它就不会影响以前的版本。喜欢:
任何帮助,将不胜感激。
c++ - 宏定义中的参数数量
我有一些模板化函数,由于模板类型,它具有不同数量的参数。这个函数是用宏定义包装的。
当我只使用一个参数进行函数调用时,一切都很好,但我需要更多。我查看了 boost 它通过定义不同的宏来完成这些事情,如下所示:
但是此代码标记为可移植的编译器。有办法使用带有任意数量参数的一些定义。我怎样才能做到这一点?
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:
(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.
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?
c++ - 具有零参数和逗号的可变参数宏
考虑这个宏:
当与零参数一起使用时,它会产生错误的代码,因为编译器需要逗号后的标识符。实际上,VC 的预处理器足够聪明,可以删除逗号,但 GCC 的则不然。由于不能重载宏,因此似乎需要一个单独的宏才能使这种特殊情况正确,如下所示:
有什么方法可以在不引入第二个宏的情况下使其工作?
c - 我可以用 __VA_ARGS 在中间而不是结尾来定义可变参数 C 预处理器宏吗?
如果我这样做,GCC 会抱怨:
给我这两个理由:
显然,C99 风格的可变参数宏期望在省略号之后立即有右括号,有效地要求可变参数列表是宏的最后一个参数。我需要它位于中间以生成上述宏中描述的速记符号。GCC 是否支持此功能,使用另一种(非 C99)可变参数宏样式?我可以以其他方式模仿它吗?我不希望最后的可变参数列表,它会使我的符号混乱。而且我只能使用GCC。
c - 附加到 __VA_ARGS__
我知道我可以这样做:
这只是一个示例,它是更复杂解决方案的一部分。关键是我需要将可变数量的参数附加到前 123 个参数中。如果没有将参数传递给 MACRO,## 会使编译器在 123 参数之后去掉逗号。
但现在我想将参数附加到 api,如下所示:
诺坎多。一种解决方案是使用两个宏,例如 MACRO 和 MACRO_V,并使 _V 版本不处理任何参数。但是有没有办法让它与一个宏一起工作?
c - C中可变参数宏的问题
我在C中的 #define 语句中的可选参数有问题,或者更具体地说是 gcc 4.2:
这显然是一个人为的例子,但确实显示了问题。有谁知道我怎样才能正确获得“解决”的可选参数?
附加信息:如果我删除##
before __VA_ARGS__
,并执行以下操作:
编译,但它不再适用于零参数,因为它会解析为func(tmp, )
编辑:在将我的所有代码转换为依赖 P99 而不是我之前的代码之后(这最终大大破坏了我的代码,哎呀),我意外地发现这有效:
编译并使用任意数量的参数(并且传入和返回正确的值),但是......这应该是合法的吗?