在c中定义类似数组的访问成员宏[关闭]

Posted

技术标签:

【中文标题】在c中定义类似数组的访问成员宏[关闭]【英文标题】:define array-like access member macro in c [closed] 【发布时间】:2022-01-19 15:12:11 【问题描述】:

我在下面有一个 typedef

typedef struct arr_s 
    void** arr;
 *arr_t;

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

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

【问题讨论】:

你试过简单的#define k(i) k->arr[i]吗? OT:不要将指针隐藏在类型定义后面。如果您绝对愿意,请使用显示指针性质的类型名称。 当然,s(i) 不起作用。您将如何使用没有名称的宏?您可以尝试#define x(a, i) a->arr[i] 并通过x(k, i)x(s, i) 使用它。 -- 无论如何,你为什么要使用宏?这是XY problem吗? 在 C++ 中,您可以为结构实现 operator(),但您使用的是 C。 【参考方案1】:

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

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

当您调用GEN_GET 时,它将创建一个内联函数,该函数的名称为var,但后缀为_get,并通过接收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,您可以将声明 arr 放入函数中,但也必须将 GEN_GET(arr) 放入该函数中,并且无法从其他任何地方调用生成的内联函数 arr_get()。这些限制是因为范围问题。你甚至不能在 C++ 中做到这一点,它实际上在它的方法中提供了一个指向对象的指针,即this。而且您试图不输入对象指针,即兴发挥 OOP 基础知识。

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

【讨论】:

以上是关于在c中定义类似数组的访问成员宏[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎样通过索引获取结构体成员的值

宏定义中对结构体变量进行初始化,结构体成员变量前为啥加点号??

mfc怎么设置全局变量

ios 中 成员变量和属性的区别

数组访问越界

数组访问越界