【问题标题】:define array-like access member macro in c [closed]在c中定义类似数组的访问成员宏[关闭]
【发布时间】: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。

标签: arrays c macros


【解决方案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] 过于冗长,否则您永远不应该使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2013-05-21
    相关资源
    最近更新 更多