C 当其中一个从另一个定义返回时,如何使用##连接
我有一个可变长度的宏,需要根据传递的参数执行操作 有没有一种方法可以直接使用C 当其中一个从另一个定义返回时,如何使用##连接,c,C,我有一个可变长度的宏,需要根据传递的参数执行操作 有没有一种方法可以直接使用\uu VA\u ARGS\uu获取带索引的参数 #define OPERATION5(_1) (_1) #define _GET_1ST_ARG( N, ...) (N) #define TOP_MACRO(...){\ OPERATION##(_GET_1ST_ARG(1));\ } 您需要首先展开标识符,然后将其与另一个宏过程连接起来 获取第一个参数时,需要删除大括号。无法连接() 为什么不使用普
\uu VA\u ARGS\uu
获取带索引的参数
#define OPERATION5(_1) (_1)
#define _GET_1ST_ARG( N, ...) (N)
#define TOP_MACRO(...){\
OPERATION##(_GET_1ST_ARG(1));\
}
(
)为什么不使用普通函数呢?函数类型定义有很多错误。如果您想要快速性能,请了解内联函数:.C不提供任何工具来使用计算索引挑选宏变量参数列表的元素。对于常量索引,您可以使用固定宏,类似于
\u GET\u 1ST\u ARG
r、 您应该避免使用以下划线开头,后跟大写字母的标识符,因为这些标识符在C中有保留的用途。此外,这似乎是一个X-Y问题:为了实现目标X,您正在尝试做一些复杂且没有得到很好支持的事情Y。如果相反,您询问X,您可能会得到一个更有用的答案回答。
// CONCATenate
#define CONCAT(a, b) a ## b
// eXpand then CONCATenate
#define XCONCAT(a, b) CONCAT(a, b)
#define OPERATION5(_1) (_1)
// remove `(` they can't be `##` concatenated
#define GET_1ST_ARG(N, ...) N
#define TOP_MACRO(...) XCONCAT(OPERATION, GET_1ST_ARG(__VA_ARGS__))(arg)
// expands `OPERATIONS5(arg)`
// expands to `(arg)`
TOP_MACRO(5)