A single-header supports OOP in pure C.
Using power of preprocessor and hacking on assembly to unlock the limits.
Foo f = new(Foo)(10); // create Foo instanceassert(f->get() == 10); // get value
f->base.release(); // release- C++/Java inspired OOP
- Public, private members
- Constructor, destructor
- Abstraction
- Inheritance
- Zero dependency
- No breaking editor's intellisense
x86/_64targetarmtarget
- Just add
obj.hto your C source - See tests for more
// C++ native OOP // C with obj.hclassFoo { | class(Foo, public(
public: | int (*get)();
Foo(int bar); | ), private(
intget(); | int bar;
private: | ));
int bar; |
}; | ctor(Foo)(int bar) {
| obj_setup(Foo);
Foo::Foo(int bar) { | obj_bind(Foo, get);
this->bar = bar; | self->bar = bar;
} | obj_done(Foo);
| }
intFoo::get() { |
returnthis->bar; | method(Foo, int, get)() {
} | obj_prepare(Foo);
| return self->bar;
| }
|
Foo *f = new Foo(15); | Foo f = new(Foo)(15);
f->get(); | f->get();
delete f; | f->base.release();| GCC 4+ | MSVC 14+ | Clang 5+ | TCC 0.9 | |
|---|---|---|---|---|
| Windows (x86 / x64) | ✅ | ✅ | ✅ | ✅ |
| Linux (i386 / x86_x64) | ✅ | _ | ✅ | ✅ |
| Mac OSX (i386 / x86_64) | ✅ | _ | ✅ | _ |
- On Visual Studio 2017 15.8+, please disable Just My Code debugging
We can't explain in detail, but something like binding
thisto a function in JavaScript.
Simulate a simple class with struct:
structA {
void (*todo)(); // method
};And we have a static function:
staticvoidfn_todo() {}Next, bind A instance (aka this) to fn_todo 🙄
binded_todo=bind(fn_todo, myA);Finally 😎
myA->todo=binded_todo;
myA->todo(); // call it like a method- This is a fork of yulon/clofn
- Just copy function header and inject some code to pre-allocate this inside
- Currently, support
x86andx86_64only
Function template:
staticvoidfn_todo() {
volatilesize_tself= ...;
...Disassemble:
; prologmovrax, ...mov QWORD PTR [rbp-8],rax ...Generated function:
[copied prolog]> x86| moveax,[data]| jmp[addr]> x86_64| movrax,[data]| pushrax| movrax,[addr]| jmpraxRefs:
See obj.h for more.