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

c++ - 连接嵌套宏结果

我有以下一组宏:

现在,我想创建另一个通用宏来评估以前的宏,我正在尝试这样做:

其背后的想法是BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)评估正确的参数计数,然后将转向正确的宏。

但是,不幸的是,我刚刚发现BOOST_PP_VARIADIC_SIZE()将在连接到 之后进行评估macro_,从而导致不需要的代码macro_BOOST_PP_VARIADIC_SIZE

有没有办法我可以先评估BOOST_PP_VARIADIC_SIZE然后连接到macro_

0 投票
1 回答
5305 浏览

c - C 可变参数宏 __VA_ARGS__ vs ##__VA_ARGS__ in clang

我有以下两个宏:

当我嵌套它们时,F1 可以工作,但 F2 无法编译。

这段代码:

导致以下 clang 错误:

请注意,F1 没有警告或错误,只有 F2 有问题。

这里发生了什么:这是预期的行为还是clang中的错误?

更重要的是,有没有办法让我调整 F2 以使其工作。我真的更喜欢 F2 的语法。


更新

遵循@KenThomases 的建议,我跑了clang -E -o foo.i foo.m

我将此作为缺陷提交给 llvm.org:错误 19141

0 投票
2 回答
203 浏览

c - 为什么在使用 __VA_ARGS__ 从宏调用函数时“vsprintf”会卡住?

我有以下宏:

函数TR_Trace如下所示:

我正在像这样使用它:

这里的问题是,一旦执行到vsprintf(tempString, string, aptr); 它卡在那里。

有人知道发生了什么,或者我没有正确使用VA_ARGS吗?

问候。

0 投票
1 回答
1209 浏览

c++ - 带有可变参数的 C++ 宏

1.#define debug(...) printf( __VA_ARGS__)

2.#define debug(...) std::cout<< __VA_ARGS__

显然,1 可以,2 编译时会出错。是否有可能将“std::cout”与可变参数一起使用?

这个宏有什么意义?

'debug' 宏用于打印调试代码的内容。

0 投票
3 回答
341 浏览

c - 在对包含逗号的参数进行字符串化时,Visual C++ 与 gcc/clang 中的不同行为

我正在使用字符串化运算符将可能包含传递给宏的逗号的参数转换为字符串。据我所知,有些字符不能被字符串化——特别是逗号(,),因为它用于分隔参数和右括号()),因为它标志着参数的结束。所以我使用可变参数宏将逗号传递给字符串化运算符,如下所示:

它工作正常。但是我突然想到如果没有可变参数宏会发生什么,所以我修改了宏:#define MAKE_STRING(x) #x. 它在 Visual c++ 2008/2010 中意外地编译得很好,并10, 20在 gcc/clang 按预期给出编译错误时输出:

宏“MAKE_STRING”传递了 2 个参数,但只需要 1 个

所以我的问题是:Visual c++ 是在做额外的工作还是行为未定义?

0 投票
2 回答
277 浏览

c - 函数的可变参数中是否需要 va_start?

我正在阅读 Linux 编程接口文本,他们展示了这个函数来处理错误。在手册页(man stdarg)中,它说va_start必须首先调用以进行初始化ap以供va_arg()and使用va_end

那么为什么在这个函数中没有va_start

0 投票
4 回答
2103 浏览

c++ - 我们可以实现一个 max 或 min 宏,它可以接受可变参数(超过两个参数)

我想实现一个新的 max/min 宏,它可以接受两个以上的参数,例如:

然后,我可以像这样使用它:

如果这个宏可以帮助我们实现那个宏?

0 投票
5 回答
1998 浏览

c++ - 如何使用宏打印可变数量的参数?

我想定义一个带有可变数量参数的宏,它打印每个给定参数的名称和值。

例如 :

MACRO(x)会打印x = 123 MACRO(x,y)会打印x,y = 123,666

更好的宏将更具可读性

BETTER_MACRO(x,y)会打印x = 123, y = 666

对于一个变量,我可以通过以下方式进行管理:

#define MACRO(...) cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << endl;

更多,它不起作用。

通过这种方式,我想到了一些辅助问题。

1)如何获得赋予宏的变量数量?2)如何访问每个参数?

天真地猜测,我们可以回答这两个问题。

然后我们希望通过以下方式定义宏。

#define BETTER_MACRO(...) {for (int i=0;i<=nb_variables;i++) {cout << #var[i] << var[i];}}

0 投票
1 回答
1452 浏览

c++ - 解压可变参数宏的任何技巧?

解压可变参数宏的任何技巧?例如,

#define READ(...)意思是一一阅读论据

READ(a, b, c)将被解包到read(a); read(b); read(c)

0 投票
3 回答
771 浏览

c - 如何在 VC++6.0 中模拟可变参数宏?

VS2010中,我编写了以下可变参数宏来将信息转储到文件中。

这些宏经常出现在我的程序中。

可悲的是,现在我必须将我的代码迁移到不支持可变参数宏的上古 IDE VC ++ 6.0 我写了一个可变参数函数。

但是我必须将数十行甚至数百行代码IND_FP(format, ...)IND_FP(fp, indent, format, ...).

有什么可以帮助我的宏技巧吗?或者我最好使用显式参数并习惯冗余?