是否有用于成员方法的 C 宏?

dan*_*jar 5 c methods macros function-pointers class

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

s=>size(); // implicitly pass self reference
Run Code Online (Sandbox Code Playgroud)

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

Fer*_*ira 5

是的,如果您能够使用可变参数宏功能,则有可能:

// ...

#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));

    // ...
}
Run Code Online (Sandbox Code Playgroud)