On Tuesday, 17 February 2026 at 15:27:20 UTC, MaxNaderer wrote:
I have looked into __traits and I guess i need to go this way.

You can use traits, I've done something like that for Pascal instead of C. It roughly looks like:

```D
string headerFromDModules(modules...)()
{
        string result = "#pragma once\n";

        foreach (mod; modules)
        {
                foreach (mem; __traits(allMembers, mod))
                {
static if (is(typeof(__traits(getMember, mod, mem)) == function))
                        {
                                alias F = __traits(getMember, mod, mem);
                                static if (functionLinkage!F == "C")
                                {
                                        result ~= functionToHeader!(mem, F);
                                }
                        }
                }
        }

        result ~= "\n";
        return result;
}
```

`string functionToHeader(string mem, alias F)()` then has to introspect Parameters!F, ParameterIdentifierTuple!F, ParameterStorageClassTuple!F, and ReturnType!F and generate a C string accordingly. It can be used like so:


```D
import pkg.a;
import pkg.b;

import std;

void main()
{
    File("header.h", "w").write(headerFromDModules!(pkg.a, pkg.b);
}
```

The perfect way would be to get a XML or json from the functions so that the bindings can be easily automated

dmd has the `-X` flag to generate JSON which I'd wager has sufficient information to generate C headers, but you can also open an enhancement request in the issue tracker (https://github.com/dlang/dmd/issues) to make dmd directly generate C headers because it sounds like a worthwhile feature.

Reply via email to