[Gc] The GC_INIT() macro and binding libgc in D

Alex Rønne Petersen xtzgzorex at gmail.com
Fri May 11 10:42:23 PDT 2012


Hello folks,

In making a binding for libgc in the D programming language, I've come
across one particular macro in gc.h that worries me a lot: GC_INIT().
As you may or may not know, D doesn't have macros, nor does it support
directly including a C header file, so one has to write type and
function declarations matching those of the C header file. This
strategy actually works fine in most cases, except when the C code
makes heavy use of macros.

In libgc's case, GC_INIT() is very important for portable programs.
The idea is apparently that it is defined to do some extra work needed
for certain platforms that make initialization more painful than one
would prefer. On other platforms, it just calls GC_init(). I'm
honestly not sure why this additional logic isn't simply inside
GC_init() instead of using macros. Having the logic in GC_init() would
improve encapsulation, ease portability and binding to libgc, and also
maintain some sort of binary compatibility across libgc versions.

So my question is this: Why is GC_INIT() a macro at *all*? Why not
just make GC_init() do the Right Thing and avoid relying on the
preprocessor in the header file? It seems to me that everyone wins if
GC_init() is made to do all the needed logic...

Regards,
Alex


More information about the Gc mailing list