问题标签 [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 - 计算参数总大小的 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)
这些事情中的任何一件都可以让我这样做:
- 从可变参数宏中解压缩VA_ARGS的良好、灵活的方法。如果有任何方法可以索引它
- 可以依赖递归宏的一个很好的例子(以及它在最大参数数量、编译器兼容性、标准合规性等方面的限制)。
- 一种通过不同类型的函数检查直接获取所有 args 总大小的方法。GCC 似乎有一些疯狂的函数来构建可能适用的呼叫转发的函数调用,但这些是特定于编译器的,几乎没有文档记录,并且似乎没有报告它们分配的内存块的大小。他们还报告了大量不相关的信息。
c++ - 可变参数宏
有没有办法编写这样的宏:
还是我需要为每个人定义这个n
?
C++0x 的答案没问题。
编辑:我在问如何创建这种形式的宏,而不是通常采用可变数量参数的宏。
目标: : 所以我可以执行以下操作:
因此,mytuple
可以在没有移动和复制的情况下创建它,也可以在没有使用聚合构造的情况下对临时对象进行不必要的引用。
c++ - 非可变的 printf 样式记录器
我们的 C/C++ 项目正在使用一个新的内部脚本,该脚本自由地包装了 SWIG 中的每个函数,以供 python 脚本使用。由于 SWIG 不能很好地包装可变参数函数,它会阻塞我们的 logger 函数。
因此,我决定将可变参数功能隐藏在 SWIG 永远不会出错的宏中,如下面的简化示例所示:
这个可以吗?这个问题有更好的解决方案吗?谢谢。
visual-c++ - 是否可以防止在 Visual C++ 中删除带有空 __VA_ARGS__ 的逗号?
在 Visual Studio 2005 上,我有一个看起来像这样的宏(示例!!):
只要该函数至少接受一个参数,我就可以了。
当函数接受零参数时,预处理器“有用地”删除“尾随逗号”,扩展如下:
太好了,不是吗?
如何修复此宏,使其__VA_ARGS__
在 Visual C++ (VS 2005) 上使用零?
variadic-functions - 将可变参数宏转换为可变参数模板函数?
给定以下形式的可变参数宏:
——如何将其重写为可变参数函数模板?
更新:我对如何声明Args
:&&
或const&
什么的引用类型特别感兴趣?
更新:请注意,FType 应该是一个“普通”函数指针。
c - 在多级宏调用中对宏参数进行字符串化
我有一个这样的宏:
有用:
FOO+BAR=579
这按预期打印。
现在我正在尝试定义一个调用 SHOW_EXPR 的宏:
这打印Look ma, 123+BAR=579
,这也是预期的,但这不是我想要的。
是否可以定义 MY_SHOW_EXPR 以使其做正确的事情?
(实际的宏比这里显示的要复杂一些。我知道宏是邪恶的。)
c++ - 可变参数宏的 2 种不同语法
它们之间有什么功能上的区别吗?(即,在某些情况下,其中一个可以以比其他更好的方式使用)。另外,这两种语法都包含在 C++11 中吗?
c++ - MSVC++ 可变参数宏扩展
所以我有一个在 GCC 中运行良好的宏,但在 Microsoft 的 C++ 编译器中却不行。我希望有人可能知道一种解决方法,或者可以向我解释为什么它会这样。
我确信这个宏不完全是“标准的”,但它真的会帮助我。
这是宏的功能示例:
以下是我如何使用这个宏:
以下是 GCC 扩展上述内容的方式:
但微软出于某种原因将我所有的 __VA_ARGS__ 扩展为一个论点:
有人知道这是为什么吗?有什么技巧可以让微软像 GCC 一样扩展它吗?也许多加几对括号?
像这样的宏确实可以帮助我替换一堆“胶水”代码,但由于这个问题,我无法将它移到我的 VS 项目中。任何帮助将不胜感激!
谢谢。
c++ - 清理 C/C++ 代码揭示了可变参数宏的问题
我们正在 C、C++ 和 Java 的代码库上进行一些代码清理、修复有符号/无符号比较、运行静态分析等。
我们收到的警告之一是
及其伴随的警告
现在,在 C 代码中,我使用C99 标准可变参数宏来解决问题,但在 C++ 代码中,正确答案是什么?使用相同的 C99 样式会导致不同的警告
我没有看到任何答案。
我们在 Linux 中使用 GCC (G++) 4.4.3。
我希望有一些标志或其他方法可以纠正或禁用代码的特定部分 - 但它用于几乎每个文件中使用的日志记录......
c - 宏化参数
我有一个带有许多“宏化”参数集的系统(“#define name value,value,value”形式的宏)。我想将这些传递给宏,但是当我这样做时出现错误。
例子:
在 Visual CI 中得到: