On Tue, 12 Jul 2011 09:42:22 -0400, Johannes Pfau <s...@example.com> wrote:

Steven Schveighoffer wrote:
On Tue, 12 Jul 2011 05:36:15 -0400, Johannes Pfau <s...@example.com>
wrote:

From a discussion related to derelict:
How do you write this:
-------------------------------------------------------
alias extern(C) int function(void* test) FTInitFunc;
FTInitFunc FT_Init_FreeType
-------------------------------------------------------
without the alias?
-------------------------------------------------------
extern(C) int function(void* test) FT_Init_FreeType;
-------------------------------------------------------
is not the same!
both are fields containing a C function pointer, but the first field
has D name mangling (_D4test16FT_Init_FreeTypePUPvZi) and the second
has C name mangling: (FT_Init_FreeType, which conflicts with the C
function FT_Init_FreeType)

And a related question from stackoverflow:
(http://stackoverflow.com/questions/6257078/casting-clutteractor-to-clutterstage)
How to write this:
-------------------------------------------------------
alias extern(C) void function(void*, const char*) setTitleFunc;
auto clutter_stage_set_title =
getSym!(setTitleFunc)("clutter_stage_set_title");
-------------------------------------------------------
without the alias?

extern(C) extern(C) maybe?  :)

or maybe:

extern(C) int function(void * test) extern(C) FT_Init_FreeType;

Nope, that doesn't work:
---------------------------------
test.d(3): no identifier for declarator int C function(void* test)
test.d(3): semicolon expected, not 'extern'
test.d(3): no identifier for declarator FT_Init_FreeType
---------------------------------

also, if that worked, shouldn't it be equal to this?
---------------------------------
extern(C) int function(void* test) FT_Init_FreeType;
---------------------------------
This works, but it's not what I want.
Derelict needs a _field_, FT_Init_FreeType with D name mangling. So the
usual {module}.{module}.FT_Init_FreeType in mangled form.
This _field_ should contain a pointer to a extern(C) function.


Oh, I misread which one did which.  I thought it was the opposite.

Hm... so extern(C) affects both the function pointer type and the name mangling. Interesting.

But wait, don't normal D functions have C calling convention? I thought that was one of the benefits of D's ABI?

-Steve

Reply via email to