在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中定义类似数组的访问成员宏[关闭]的主要内容,如果未能解决你的问题,请参考以下文章