问题标签 [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++ - 将宏参数中的序列转换为单独的宏
如果定义类似于 MACRO(name, seq) 并且代码如下,如何访问宏中的每个元素:
我想生成下一个代码:
或类似的东西。换句话说,我想分别处理每个参数(我不在乎定义,即使它会像
元素可能更多,也可能更少。我试过__V_ARGS__
(我只需要gcc),但我只能复制所有元素,而不是单独处理它们。
我能做些什么?
PS由于某些原因,我无法使用Boost。
c++ - 可变参数宏扩展
我想知道有没有办法选择性地调用 C VARIADIC 宏。
首先,让我展示一些我想要实现的代码:
我在 VC11、GCC4.8 和 Clang 3.4 中对其进行了测试,但没有一个可以按照我的意愿编译它。
是的,我想通过它的参数计数来调用一个宏,但是宏被扩展为:
没有什么诀窍吗?
编辑:
我更详细地写了我真正想要的东西。
我从答案中找到了一些线索并编辑了我的代码。
它在 Xcode5 和 VC11 中进行了测试,但在 VC11 中不起作用。
VC11 的输出是这样的:
警告 C4002:宏“SerialSize1”的实际参数过多
我能做些什么来修复它?
c - C 预处理器将“int x”拆分为 int & x
我需要能够获得以下信息:
导致
编译为
或者如果它编译为:它不会是世界末日:
甚至这也可以:(我可以编码 MY_OTHER_MACRO 以处理任一结果)
或者,如果有某种方法可以计算由空格分隔的标记(并假设“*”是单独的标记,我也可以使用它 - 例如 2 对 3)通常,标记用逗号分隔,只要我知道。有没有办法使用另一个字符?
c++ - 如何对包含逗号的字符串进行字符串化?
我想在编译命令中传递一个版本字符串:
在我的代码中,我有以下内容:
这不起作用,因为VERSION
宏中有一个逗号,所以看起来我正在传递两个参数TOSTR()
(显然,宏只有在它作为一个唯一参数VERSION
传递给之后才会被扩展)。STRINGIFY()
我在这里找到的以下方法也不起作用:
因为这似乎与
也就是说,宏CONCAT()
不会被扩展。
注 1:我宁愿不在命令行中传递C字符串,因为版本字符串实际上是动态生成的,并且可能包含一些引号。这意味着仅仅编写g++ -D VERSION=\""$(GENERATED_STRING)"\"
而不是对传递的参数进行字符串化是行不通的。
注意 2:如果有人找到一种完全没有任何预处理器宏的方法,我会非常高兴。
c - 使用可变参数宏和函数时“未初始化的值是由堆栈分配创建的”
我有以下程序http://ideone.com/1RPs8E。它使用可变参数函数 tlog 来打印日志文件中的一行。它接收打印行的级别、文件名、行和用于调试信息的函数以及 printf 的格式和参数列表。
我还使用了一个 LOGL 宏,它为当前文件、行和函数调用 tlog 函数。
以及使用 LOGL 宏的各种宏,例如:
在 valgrind 中运行程序时:
我收到以下错误:第 150 行的“未初始化的值是由堆栈分配创建的”(当我使用 DEBUGEX 宏时)。完整日志在这里: http: //pastebin.com/rZu4nkHd
代码有什么问题?对我来说似乎没问题。如果我从 tlog 函数和所有调用它的宏中删除 level 参数,则不再发生错误。
在 Archlinux 上使用 gcc 4.8.2 测试,在 Ubuntu 12.04.3 上使用 gcc 4.6.3 测试
c - 检查参数是否在 C 中的可变参数宏中传递
为了更清晰的错误处理,我使用宏(它使用 C99 和 GCC 扩展);行为就像标准assert
:
哪里say
是格式化输出。并像这样使用它:
当我没有特定的错误信息时,我必须写A(cond, 0)
. 但我只想写A(cond)
在这种情况下。如何A
针对这种行为修改我的宏?即我需要一种方法来检查msg
参数是否没有传递给宏。
c - 可变参数宏和尾随逗号
我正在尝试在 C 中进行面向对象,并希望有一个用于表示法的语法糖宏
进入
不幸的是,当一个方法不带参数时,就会出现尾随逗号问题
给
是否有任何可移植(无##__VA_ARGS__
或 Visual Studio)的方式来执行此操作?
我想出了一个,但我需要交换对象和方法
许可证
编辑
在下面两个好的答案的帮助下,我将使用这些宏来完成。它最多可以使用 16 个参数,但可以轻松扩展
c - 使用可变参数和后期扩展创建字符串化宏参数列表
我有以下问题 - 给定可变数量的宏参数 argX 以创建字符串化参数列表#argX
例子:
我正在使用 Boost,因此对于每个数量的参数使用辅助宏并将 LIST(...) 分派到适当的 LIST_n(arg1, ... argn) 来实现上述宏并不难。
当 LIST 的输入本身是宏时,问题就开始了。在这种情况下(如果我使用 ... 和 __VA_ARGS__),宏在被字符串化之前会被扩展,给出:
我希望它可以与 Windows 标头中定义的宏一起使用,并且大多数值都有宏(MB_OK、AF_INET、...),所以我得到的只是一个字符串化数字的列表。
不使用 __VA_ARGS__ 时一切正常:
我尝试了几个将 __VA_ARGS__ 的扩展推迟到以后的宏(例如,直到 LIST_1,它没有可变参数),但没有任何效果。
这甚至可以使用 C 预处理器来实现吗?
c++ - Generate array using variadic macros
I want to generate an array of function pointers using a variadic macro. Here's an example.
Before preprocessing:
#xA;After preprocessing:
#xA;Is this possible?
Basically, I need to have something before the array expansion, something after the array expansion, and add a prefix to every expanded variadic macro argument.
c - 编写使用传递的参数名称的可变参数宏
我想编写一个可变参数宏,它以某种方式知道传递的参数的名称。例如:
编码:
将产生输出
希望有人知道这个问题的答案。