gpt4 book ai didi

c - 成员方法有 C 宏吗?

转载 作者:太空狗 更新时间:2023-10-29 15:29:21 25 4
gpt4 key购买 nike

可以使用函数指针将函数耦合到它们的引用结构。

struct string
{
char *value;
size_t (*size)(struct string *);
};

size_t size(struct string *this)
{
size_t i;
for(i = 0; this->value[i] != '\0'; ++i);
return i;
}

struct string *construct()
{
string this = (string)malloc(sizeof(struct string));
this.size = &size;
// ...
}

int main()
{
struct string *s = construct();
// ...
s->size(s); // explicitly pass self reference
}

但我想摆脱手动传递 this 指针。我知道当您调用对象的方法时,这是在 C++ 中隐式完成的。有没有办法在 C 中为此创建适用于所有方法和签名的宏?

例如,我可以想到这样的语法。

s=>size(); // implicitly pass self reference

请注意,这仅用于学习目的。我知道如果可能的话最好只使用 C++,并且您想使用类耦合。但我对如何在 C 中完成它很感兴趣。

最佳答案

是的,如果您能够使用 variadic macros 是可能的特点:

// ...

#define CALL_METHOD(x, y, ...) x->y(x, ##__VA_ARGS__)

struct string
{
char *value;
size_t (*size)(struct string *);
int (*compare)(struct string *, struct string *);
int (*set_value)(struct string *, const char *);
};

// ...

int main()
{
// ...

CALL_METHOD(s1, set_value, "foo");
CALL_METHOD(s2, set_value, "bar");

printf("s1->size(s1) = %zu;\n", s1->size(s1));
printf("CALL_METHOD(s1, size) = %zu;\n", CALL_METHOD(s1, size));
printf("s1->compare(s1, s2) = %d;\n", s1->compare(s1, s2));
printf("CALL_METHOD(s1, compare, s2) = %d;\n", CALL_METHOD(s1, compare, s2));

// ...
}

关于c - 成员方法有 C 宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21490405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com