问题标签 [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 回答
929 浏览

c - 计算参数总大小的 C 函数

我目前正在寻找以字节为单位计算传递给函数的参数的总大小。理论上,一个人可以写出sizeof(x)每一个论点。但是,如果要为很多功能执行此操作,这将是极大的浪费时间。我试图找出参数的空间量,以便我可以分配适量的内存来存储它们并存储它们(用于各种函数,具有混合类型)。

我正在寻找一个表达式,可以确定非可变参数函数的所有参数的大小,无论它们的名称如何,也不管有多少(在合理的范围内,我现在只支持大约 64 个参数很好)。它可以是一个函数,一个预处理器宏,我不知道它的实现。我也对处理可变参数函数感兴趣,但我很确定这是不可能的,因为当你进入可变参数函数时,你已经丢失了有关数据类型的所有信息。

目前,我发现了三种可能会被扭曲让我这样做的方法。第一个是基于Laurent Deniau 的 arg 计数的概念。理论上,我可以使用宏来生成函数头,并做一些类似的花哨的步骤来获取 args 的数量并分派给处理每个有 N 个参数的个别情况的各种宏。(见:丑)。基本上,我只是使用宏给所有函数名起别名,然后在每个函数名上使用 sizeof。问题是,我需要为我想要表示的每个长度的参数创建一个宏。而且我真的不喜欢做 64 件(或更多)事情来完成一项工作。

第二种方法是尝试遵循Ben Klemer 的“更好的可变参数”的方法。我不会使用他的所有方法,但我会尝试生成一个结构,该结构将函数的 arg 签名表示为结构。然后我可以尝试获取结构元素的大小(甚至结构本身,如果我关心的只是对空间的保守估计)。这有几个问题。首先,它可能只适用于符合 C99 的东西(仍在检查中)。其次,它导致为每个实现的功能创建一个额外的结构。这不完全是个问题,但仍然存在问题,即他制作结构的方法最终与函数的名称相同(因此您仍然需要引用名称才能使用它们)。

第三种可能的方法是递归宏,尽管我不确定编译器有多高兴。理论上可以通过调用形式为 的宏递归地从VA_ARGS中弹出元素。显然,当VA_ARG为空时需要一个暂停规则(以及确保您不会被浮动 + 符号抓住的东西),但您明白了。POPPER(arg, ...) POPPER(VA_ARGS) + sizeof(arg)

这些事情中的任何一件都可以让我这样做:

  1. 从可变参数宏中解压缩VA_ARGS的良好、灵活的方法。如果有任何方法可以索引它
  2. 可以依赖递归宏的一个很好的例子(以及它在最大参数数量、编译器兼容性、标准合规性等方面的限制)。
  3. 一种通过不同类型的函数检查直接获取所有 args 总大小的方法。GCC 似乎有一些疯狂的函数来构建可能适用的呼叫转发的函数调用,但这些是特定于编译器的,几乎没有文档记录,并且似乎没有报告它们分配的内存块的大小。他们还报告了大量不相关的信息。
0 投票
3 回答
1829 浏览

c++ - 可变参数宏

有没有办法编写这样的宏:

还是我需要为每个人定义这个n

C++0x 的答案没问题。

编辑:我在问如何创建这种形式的宏,而不是通常采用可变数量参数的宏。

目标: : 所以我可以执行以下操作:

因此,mytuple可以在没有移动和复制的情况下创建它,也可以在没有使用聚合构造的情况下对临时对象进行不必要的引用。

0 投票
1 回答
830 浏览

c++ - 非可变的 printf 样式记录器

我们的 C/C++ 项目正在使用一个新的内部脚本,该脚本自由地包装了 SWIG 中的每个函数,以供 python 脚本使用。由于 SWIG 不能很好地包装可变参数函数,它会阻塞我们的 logger 函数。

因此,我决定将可变参数功能隐藏在 SWIG 永远不会出错的宏中,如下面的简化示例所示:

这个可以吗?这个问题有更好的解决方案吗?谢谢。

0 投票
1 回答
1699 浏览

visual-c++ - 是否可以防止在 Visual C++ 中删除带有空 __VA_ARGS__ 的逗号?

在 Visual Studio 2005 上,我有一个看起来像这样的宏(示例!!):

只要该函数至少接受一个参数,我就可以了。

当函数接受零参数时,预处理器“有用地”删除“尾随逗号”,扩展如下:

太好了,不是吗?

如何修复此宏,使其__VA_ARGS__在 Visual C++ (VS 2005) 上使用零?


显然这是 VS2005 中的一个错误

0 投票
2 回答
361 浏览

variadic-functions - 将可变参数宏转换为可变参数模板函数?

给定以下形式的可变参数宏:

——如何将其重写为可变参数函数模板?

更新:我对如何声明Args:&&const&什么的引用类型特别感兴趣?

更新:请注意,FType 应该是一个“普通”函数指针。

0 投票
1 回答
699 浏览

c - 在多级宏调用中对宏参数进行字符串化

我有一个这样的宏:

有用:

FOO+BAR=579这按预期打印。

现在我正在尝试定义一个调用 SHOW_EXPR 的宏:

这打印Look ma, 123+BAR=579,这也是预期的,但这不是我想要的。

是否可以定义 MY_SHOW_EXPR 以使其做正确的事情?

(实际的宏比这里显示的要复杂一些。我知道宏是邪恶的。)

0 投票
1 回答
256 浏览

c++ - 可变参数宏的 2 种不同语法

它们之间有什么功能上的区别吗?(即,在某些情况下,其中一个可以以比其他更好的方式使用)。另外,这两种语法都包含在 C++11 中吗?

0 投票
3 回答
10768 浏览

c++ - MSVC++ 可变参数宏扩展

所以我有一个在 GCC 中运行良好的宏,但在 Microsoft 的 C++ 编译器中却不行。我希望有人可能知道一种解决方法,或者可以向我解释为什么它会这样。

我确信这个宏不完全是“标准的”,但它真的会帮助我。

这是宏的功能示例:

以下是我如何使用这个宏:

以下是 GCC 扩展上述内容的方式:

但微软出于某种原因将我所有的 __VA_ARGS__ 扩展为一个论点:

有人知道这是为什么吗?有什么技巧可以让微软像 GCC 一样扩展它吗?也许多加几对括号?

像这样的宏确实可以帮助我替换一堆“胶水”代码,但由于这个问题,我无法将它移到我的 VS 项目中。任何帮助将不胜感激!

谢谢。

0 投票
1 回答
10086 浏览

c++ - 清理 C/C++ 代码揭示了可变参数宏的问题

我们正在 C、C++ 和 Java 的代码库上进行一些代码清理、修复有符号/无符号比较、运行静态分析等。

我们收到的警告之一是

及其伴随的警告

现在,在 C 代码中,我使用C99 标准可变参数宏来解决问题,但在 C++ 代码中,正确答案是什么?使用相同的 C99 样式会导致不同的警告

我没有看到任何答案。

我们在 Linux 中使用 GCC (G++) 4.4.3。

我希望有一些标志或其他方法可以纠正或禁用代码的特定部分 - 但它用于几乎每个文件中使用的日志记录......

0 投票
1 回答
746 浏览

c - 宏化参数

我有一个带有许多“宏化”参数集的系统(“#define name value,value,value”形式的宏)。我想将这些传递给宏,但是当我这样做时出现错误。

例子:

在 Visual CI 中得到: