Using templates to declare function prototypes

Heinz malagana15 at yahoo.com
Sat Jul 30 20:19:48 PDT 2011


Hello D community!!!

I'm porting the NVIDIA CUDA headers to D. The CUDA platform runs on multiple
OS, so functions prototypes (in the D way) are declared as "extern(Windows)
..." for MS Windows and "extern(C) ..." for other OS'es.

The thing is that there's no "alias extern(X) myextern;" in D to be used like
this:

version(Windows)
    alias extern(Windows) myextern;
else
    alias extern(C) myextern;

...
myextern void cudaFunct1();
myextern uint cudaFunct2(byte*);

...The C way to accomplish this is:

#ifdef _WIN32
#define CUDAAPI __stdcall
#else
#define CUDAAPI
#endif
...
CUresult CUDAAPI cuInit(unsigned int Flags);

It is a bit redundant and dirty to declare all the functions twice. So i made
a template to declare functions prototypes with the corresponding naming
convention, here's what i got:

template CUDAAPI(R, P ...)
{
	version(Windows)
		alias extern(Windows) R function(P) CUDAAPI;
	else
		alias extern(C) R function(P) CUDAAPI;
}
...
CUDAAPI!(CUresult, uint) cuInit;

This code actually compiles since its syntax is correct but when linking i
relize that the linker is still looking for the "extern(D)" symbol and by any
means, no matter where i place the extern(X), the compiler is generating the D
mangled symbol (_D5cudad4cuda6cuInitPWkZE5cudad4cuda8CUresult, at least the
template is inserted in the context).
I've tried with DMD 1.030 and the latest 1.069, both with the same result.

I also did a mixin flavored template that also compiles but is even worse
because the linker is still stuck with a templated/D mangled symbol, take a look:

template CUDAAPI(string N, R, P ...)
{
	version(Windows)
		mixin("extern(Windows) R " ~ N ~ "(P);");
}
...
mixin CUDAAPI!("cuInit", CUresult, uint);

The generated symbol for this code is:
__D5cudad4cuda55__T7CUDAAPIVG6aa6_6375496e6974TE5cud
ad4cuda8CUresultTkZ6cuInitWkZE5cudad4cuda8CUresult at 4. As you can see, the
symbol is still recognized as a template so i discard this code.

I found templates to be a very interesting case of study, templates give
languages the fun or the exciting part of programming by presenting challenges
in code complexity but still i can not get some parts of my code to work.

Any aproach or ideas on how to accomplish this template or multi extern
declaration?

Thank you so much for reading.


More information about the Digitalmars-d-learn mailing list