在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]
过于冗长,否则永远不要使用它。
我下面有一个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]
过于冗长,否则永远不要使用它。