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

c++ - 将宏参数中的序列转换为单独的宏

如果定义类似于 MACRO(name, seq) 并且代码如下,如何访问宏中的每个元素:

我想生成下一个代码:

或类似的东西。换句话说,我想分别处理每个参数(我不在乎定义,即使它会像

元素可能更多,也可能更少。我试过__V_ARGS__(我只需要gcc),但我只能复制所有元素,而不是单独处理它们。

我能做些什么?

PS由于某些原因,我无法使用Boost。

0 投票
3 回答
4156 浏览

c++ - 可变参数宏扩展

我想知道有没有办法选择性地调用 C VARIADIC 宏。

首先,让我展示一些我想要实现的代码:

我在 VC11、GCC4.8 和 Clang 3.4 中对其进行了测试,但没有一个可以按照我的意愿编译它。

是的,我想通过它的参数计数来调用一个宏,但是宏被扩展为:

没有什么诀窍吗?


编辑:

我更详细地写了我真正想要的东西。

我从答案中找到了一些线索并编辑了我的代码。

它在 Xcode5 和 VC11 中进行了测试,但在 VC11 中不起作用。

VC11 的输出是这样的:

警告 C4002:宏“SerialSize1”的实际参数过多

我能做些什么来修复它?

0 投票
2 回答
3687 浏览

c - C 预处理器将“int x”拆分为 int & x

我需要能够获得以下信息:

导致

编译为

或者如果它编译为:它不会是世界末日:

甚至这也可以:(我可以编码 MY_OTHER_MACRO 以处理任一结果)

或者,如果有某种方法可以计算由空格分隔的标记(并假设“*”是单独的标记,我也可以使用它 - 例如 2 对 3)通常,标记用逗号分隔,只要我知道。有没有办法使用另一个字符?

0 投票
2 回答
2760 浏览

c++ - 如何对包含逗号的字符串进行字符串化?

我想在编译命令中传递一个版本字符串:

在我的代码中,我有以下内容:

这不起作用,因为VERSION宏中有一个逗号,所以看起来我正在传递两个参数TOSTR()(显然,宏只有在它作为一个唯一参数VERSION传递给之后才会被扩展)。STRINGIFY()

我在这里找到的以下方法也不起作用:

因为这似乎与

也就是说,宏CONCAT()不会被扩展。

注 1:我宁愿不在命令行中传递C字符串,因为版本字符串实际上是动态生成的,并且可能包含一些引号。这意味着仅仅编写g++ -D VERSION=\""$(GENERATED_STRING)"\"而不是对传递的参数进行字符串化是行不通的。

注意 2:如果有人找到一种完全没有任何预处理器宏的方法,我会非常高兴。

0 投票
2 回答
190 浏览

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 测试

0 投票
1 回答
2025 浏览

c - 检查参数是否在 C 中的可变参数宏中传递

为了更清晰的错误处理,我使用宏(它使用 C99 和 GCC 扩展);行为就像标准assert

哪里say是格式化输出。并像这样使用它:

当我没有特定的错误信息时,我必须写A(cond, 0). 但我只想写A(cond)在这种情况下。如何A针对这种行为修改我的宏?即我需要一种方法来检查msg参数是否没有传递给宏。

0 投票
2 回答
3553 浏览

c - 可变参数宏和尾随逗号

我正在尝试在 C 中进行面向对象,并希望有一个用于表示法的语法糖宏

进入

不幸的是,当一个方法不带参数时,就会出现尾随逗号问题

是否有任何可移植(无##__VA_ARGS__或 Visual Studio)的方式来执行此操作?

我想出了一个,但我需要交换对象和方法

许可证

编辑

在下面两个好的答案的帮助下,我将使用这些宏来完成。它最多可以使用 16 个参数,但可以轻松扩展

0 投票
1 回答
221 浏览

c - 使用可变参数和后期扩展创建字符串化宏参数列表

我有以下问题 - 给定可变数量的宏参数 argX 以创建字符串化参数列表#argX

例子:

我正在使用 Boost,因此对于每个数量的参数使用辅助宏并将 LIST(...) 分派到适当的 LIST_n(arg1, ... argn) 来实现上述宏并不难。

当 LIST 的输入本身是宏时,问题就开始了。在这种情况下(如果我使用 ... 和 __VA_ARGS__),宏在被字符串化之前会被扩展,给出:

我希望它可以与 Windows 标头中定义的宏一起使用,并且大多数值都有宏(MB_OK、AF_INET、...),所以我得到的只是一个字符串化数字的列表。

不使用 __VA_ARGS__ 时一切正常:

我尝试了几个将 __VA_ARGS__ 的扩展推迟到以后的宏(例如,直到 LIST_1,它没有可变参数),但没有任何效果。

这甚至可以使用 C 预处理器来实现吗?

0 投票
1 回答
636 浏览

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.

0 投票
6 回答
345 浏览

c - 编写使用传递的参数名称的可变参数宏

我想编写一个可变参数宏,它以某种方式知道传递的参数的名称。例如:

编码:

将产生输出

希望有人知道这个问题的答案。