问题标签 [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 投票
2 回答
427 浏览

c++ - 定义宏时 `(...)` 是什么意思?

我在虚幻引擎 4 的源代码中发现了这一点,但没有识别出来。它的具体实例是:

我是一个相当新的程序员,这种宏对我来说并不熟悉。我的猜测是它定义了一个宏,它将采用函数的每个重载版本UCLASS(换句话说,一个名为 的函数的每个实例UCLASS,无论参数的类型和数量如何)并将其替换为变量ARadialForceActor_EVENTPARM。那是对的吗?如果不是,有人知道这是什么意思吗?我尝试编写一个代码片段来测试它,但它返回了error: "." may not appear in macro parameter list. 我会将它包含在下面,以防我对宏的看法是正确的,在这种情况下,如果有人能指出我在代码中出错的地方,我将不胜感激:

0 投票
2 回答
3491 浏览

c++ - 当没有传递参数时,#__VA_ARGS__ 应该生成什么?

示例代码:

使用 Visual C++(版本 14 CTP)进行预处理,得到:

在最后一行,#__VA_ARGS__变成了虚无。我宁愿把它变成“”。

对于应该发生的事情是否有明确的参考?我用谷歌搜索了很多,但找不到。

任何建议的解决方法也将很有用。

0 投票
1 回答
98 浏览

c++ - 有没有更简单的方法来做一个宏来定义一个具有可变数量参数的函数?

我有一个宏,它定义了一个带有可变数量参数的函数,该宏有一些逻辑来决定必须调用哪个真正的函数。我目前的方法如下:

我这样使用它:

我想知道是否有更好的方法来做到这一点。

注意:声明的(my_func在我的示例中)函数将用于重新实现超类中的方法,因此使用模板(我知道的那些)的方法不会解决我的问题。

Edit2:即使使用适当的可变参数模板函数,我仍然需要宏来声明函数,因为它覆盖了超类中的函数。

0 投票
1 回答
1686 浏览

c++ - 字符串化 __VA_ARGS__(C++ 可变参数宏)

让我们

我想写:

用宏

#__VA_ARGS__在 gcc 上编译得很好,但在 VStudio 上会出错。是否有可靠且便携的解决方案?

我想ITEM()在一个 .h 文件中收集 .h 文件,该文件将被多次包含在不同的#definitions 中ITEM

0 投票
5 回答
1931 浏览

c++ - 如何编写具有不同数量信息参数的 C++ 断言宏?

我正在尝试编写一个dbgassert类似于标准的宏assert。除了做什么assert,我想dbgassert打印任意数量的附加参数(包含调试信息)。

下面列出了我到目前为止所拥有的内容,它改编自这个 SO answer。但是我在代码中遇到了可变参数模板或宏的问题。如果我使用至少一个附加参数(OK 行),dbgassert则按预期工作。但是如果我没有给出额外的论点,那么编译就会失败(问题行)。

我有一些可变参数模板编程的经验(例如如何打印元组),但我以前没有使用过可变参数宏。

有人可以解释一下编写这个可变参数宏组合的正确方法是什么吗?

顺便说一句,有人能解释一下#EX宏中的魔法吗?它显示了表达式并在 gcc4.8.1 上为我工作。是否普遍支持?

谢谢,


代码:


代码的原始版本。

0 投票
2 回答
39264 浏览

c - 宏中的 __VA_ARGS__ 是什么意思?

我在 C 编程的不同标头中看到过这种表示法,我基本上理解它是传递参数,但我不明白这种“三点表示法”叫什么?

有人可以用例子解释它或提供关于 VA Args 的链接吗?

0 投票
1 回答
1011 浏览

c++ - C++ 预处理器删除对可变参数宏的调用中的空格 (Solaris Studio 12.3)

Oracle Solaris Studio 12.3 的 C++ 预处理器在扩展__VA_ARGS__.

任何人都可以在他们的系统上确认这种行为吗?这是一个已知的编译器错误吗?有没有解决这个问题的方法?

为了说明,这是一个简单的测试程序,vaargs.c

C 预处理器按预期工作:

但是 C++ 预处理器删除了“hello”和“world”之间的空格:

0 投票
2 回答
2153 浏览

c - 如何在 fprintf 中使用可变参数宏

我正在尝试通过编写宏将日志打印到文件中。我的宏如下所示:

我计划以以下格式调用LOG:

但是当我编译时出现错误

有人可以解释我哪里出错了吗?

0 投票
2 回答
1060 浏览

c++ - 每个参数都可以使用可变参数宏替换吗?

我现在阅读了很多关于可变参数宏的 SO 问题,但似乎没有人回答最简单的问题:

有没有办法对所有参数进行IDENTITY_FOR_ALL扩展?IDENTITY(X)是否也可以使用任意数量的参数?

0 投票
1 回答
134 浏览

c - 这个宏参数计数策略合法吗?

我已经知道C Preprocessor, Macro "Overloading"VA_NARGS中描述的宏 有一段时间了,但我总是被让它工作所需的大量样板文件所推迟。

我最近需要这个功能,所以我咬紧牙关,写了所有必要的宏代码,尽其“荣耀”。

在我的特殊情况下,我可以始终依赖所有 varargs 参数为特定类型。这让我想到也许有更好的方法,使用sizeof数组类型。我在我的本地系统上试过这个,它似乎工作。但是,我担心这个解决方案可能很脆弱(超出类型限制)。

我的问题是:这实际上是解决问题的安全且合理的解决方案吗?或者也许:如果我使用这个,我会问什么麻烦?最后:如果尝试存在问题(如下),是否可以应用调整以挽救一般方法?

这是代码以及演示main()功能。在这种情况下,可变参数参数都必须是整数:

这是一个成绩单:

return1()打印输出是为了验证该函数没有被调用两次。


更新:

评论中指出的(int[]) { args }是 C99 但不是 C++。在我的情况下,我可以指望对有问题的代码使用 C 编译器,但了解这个特殊限制仍然很好。

在一个现已删除的答案中指出,C99 要求一个可变参数宏参数至少由一个实际参数填充(尽管我认为规范在这方面充其量是模棱两可的)。我手头的编译器(OS X 上的 Clang)接受代码,-Wall但实际上抱怨-pedantic,正如@2501 在他们的评论中恰当地展示的那样。

-pedantic还抱怨一个零大小的数组(无参数扩展(int[]) { }),尽管这可以通过始终包含一个虚拟元素来解决。