Skip to content

Instantly share code, notes, and snippets.

@keebus
Last active March 25, 2022 21:33
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save keebus/50e751c23a61d42c531bab584a020c9f to your computer and use it in GitHub Desktop.
Save keebus/50e751c23a61d42c531bab584a020c9f to your computer and use it in GitHub Desktop.
Local opaque object in C
// library.h -------------------------------------------------------------------
#define opaque(Type) Type; int $sizeof_##Type(void);
#define opaque_impl(Type) int $sizeof_##Type(void) { return sizeof(Type); }
#define local(Type) ((Type *)alloca($sizeof_##Type()))
// foo.h -----------------------------------------------------------------------
typedef struct Foo opaque(Foo);
void foo_set_data(Foo *foo, int data);
int foo_get_data(Foo *foo);
// foo.c -----------------------------------------------------------------------
struct Foo {
int data;
};
opaque_impl(Foo)
void foo_set_data(Foo *foo, int data)
{
foo->data = data;
}
int foo_get_data(Foo *foo)
{
return foo->data;
}
// main.c ---------------------------------------------------------------------
int main()
{
// Allocates an opaque object Foo on the stack.
Foo *foo = local(Foo);
foo_set_data(foo, 42);
return foo_get_data(foo);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment