在c中定义类似数组的访问成员宏

define array-like access member macro in c

我下面有一个typedef

typedef struct arr_s {
    void** arr;
} *arr_t;

是否可以定义一个宏,使其像这样展开:

arr_t k;
k(i) will expand to k->arr[i];

没有。在 C 中,您不能拥有与变量名称不同或名称相同的宏(这是基本的符号冲突错误)。您能做的最好的事情是生成一个带有后缀的内联函数。

#define GEN_GET(var) inline var##_get(int i) {return var->arr[i];}

当您调用 GEN_GET 时,它将创建一个内联函数,该函数将是 var 的名称,但后缀为 _get 和 returns 您想要什么接受 i。您只能将它用于全局变量。如果您使用的是 GCC,您还可以在函数内部使用 this,这将生成一个嵌套函数。全局变量示例:

#define GEN_GET(var) inline var##_get(int i) {return var->arr[i];}
// put declaration of arr here
GEN_GET(arr); // will expand to inline arr_get(int i) {return arr->arr[i];}

int main() {
    arr_get(i); // will inline into arr->arr[i], hopefully.
}

或者使用 GCC,您可以将 declare arr 放在一个函数中,但也必须将 GEN_GET(arr) 放在该函数中,并且将无法调用生成的内联函数 arr_get() 来自其他任何地方。这些限制是由于范围问题。你甚至不能在 C++ 中这样做,它实际上在它的方法中提供了一个指向对象的指针,即 this。而且您试图不输入对象指针,即兴发挥 OOP 基础知识。

除非传统的 #define GET(var, i) var->arr[i] 过于冗长,否则永远不要使用它。