gpt4 book ai didi

c - 如何扩展宏中的可变参数?

转载 作者:太空宇宙 更新时间:2023-11-04 06:03:56 25 4
gpt4 key购买 nike

我基本上想要一个宏缩短器。

FOO(A,B,C) 应该扩展为定义(_FOO_A)||定义(_FOO_B)||已定义(_FOO_C)

在 GCC 中是否可以使用可变宏参数而不是实际编写 3 个函数(FOO(A)FOO(A,B)FOO( A、B、C))?

最佳答案

不可能有一个宏来扩展到包含defined关键字的东西:

If the token defined is generated as a result of this replacement process or use of the defined unary operator does not match one of the two specified forms prior to macro replacement, the behavior is undefined.

所以你不能用defined来做。如果您愿意通过测试 FOO_A_FOO_B_ 的值来放宽该约束,...可以通过使用 P99 来实现。 .例如,仅对变量列表执行逻辑或操作将是

#if P99_ORS(A, B, C)
...
#endif

P99_ORS 表达式展开为

((((A) || (B))) || (C))

然后针对 #if 表达式求值。

如果您想进行一些宏编程,也可以通过多种方式将其首先扩展为您喜欢的标记列表

#define P00_NAME_X(NAME, X, I) P99_PASTE2(NAME, X)
#define CONDITION(NAME, ...) P99_ORS(P99_FOR(FOO_, P99_NARG(__VA_ARGS__), P00_SEQ, P00_NAME_X, __VA_ARGS__))

这样

CONDITION(A, B, C, toto);

会扩展到

((((((FOO_A) || (FOO_B))) || (FOO_C))) || (FOO_toto));

关于c - 如何扩展宏中的可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com