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)