是否可以在C中模拟对象/实例方法?

Mig*_*ell 4 c oop

我知道,因为C不是面向对象的,所以最接近方法的是在结构中使用函数指针.这只是一个思考练习,但有可能:

list.add(void* data)
Run Code Online (Sandbox Code Playgroud)

没有将列表本身作为参数传递

我知道:

list.add(list_t* list, void* data)
Run Code Online (Sandbox Code Playgroud)

很容易实现,但有什么办法,使用C的任何部分,以这种方式模拟方法?

我知道答案可能是肯定的,但如果可以,请向我解释!谢谢.

Kos*_*Kos 6

这是我使用可变参数宏(C99)获得的最漂亮的语法:

#define call(obj, method, ...) ((obj).method(&(obj), __VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)

用法(点击for ideone):

struct class {
    int a;
    int (*method)(struct class* this, int b, int c);
};

int code(struct class* this, int b, int c) {
    return this->a*b+c;
}

struct class constructor(int a) {
    struct class result = {a, code};
    return result;
}

#define call(obj, method, ...) ((obj).method(&(obj), __VA_ARGS__))

#include <stdio.h>
int main() {
    struct class obj = constructor(10);
    int result = call(obj, method, 2, 3);
    printf("%d\n", result);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)