Thread overview | |||||
---|---|---|---|---|---|
|
February 13, 2009 Re: Example Attached | ||||
---|---|---|---|---|
| ||||
torhu Wrote:
> On 10.02.2009 19:51, Heinz wrote:
> > Heinz Wrote:
> >
> > I attached a rar file with the sources just to see what i'm talking about. The example is from the DMD site. Included is the extern D (ok) and the extern C (fails). To compile open "compile.bat" and to run the programs use "run.bat".
>
> Try this:
> alias extern (C) void function(void*) MyDLL_Initialize_fp;
> alias extern (C) void function() MyDLL_Terminate_fp;
> alias extern (C) MyClass function() getMyClass_fp;
Haha! cool man, thanx, it works.
I never though it could be the type but adding extern(C), the program treats variables as C function pointers. I had no idea at all that i can create extern(C) variables to be trated as C type. I learned something new today!
Thanks again.
|
February 13, 2009 Re: Example Attached | ||||
---|---|---|---|---|
| ||||
Posted in reply to Heinz | Heinz wrote:
> torhu Wrote:
>
>> On 10.02.2009 19:51, Heinz wrote:
>>> Heinz Wrote:
>>>
>>> I attached a rar file with the sources just to see what i'm talking about. The example is from the DMD site. Included is the extern D (ok) and the extern C (fails). To compile open "compile.bat" and to run the programs use "run.bat".
>> Try this:
>> alias extern (C) void function(void*) MyDLL_Initialize_fp;
>> alias extern (C) void function() MyDLL_Terminate_fp;
>> alias extern (C) MyClass function() getMyClass_fp;
>
> Haha! cool man, thanx, it works.
> I never though it could be the type but adding extern(C), the program treats variables as C function pointers. I had no idea at all that i can create extern(C) variables to be trated as C type. I learned something new today!
> Thanks again.
>
It doesn't affect normal variables. Calling a function through a function pointer, the calling convention still must be known in order for parameters to be properly passed. So any time you define a function pointer to point to a C function or to pass to a C API as a callback, it must have the proper extern linkage.
|
February 13, 2009 Re: Example Attached | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | Mike Parker wrote:
> Heinz wrote:
>> torhu Wrote:
>>
>>> On 10.02.2009 19:51, Heinz wrote:
>>>> Heinz Wrote:
>>>>
>>>> I attached a rar file with the sources just to see what i'm talking about. The example is from the DMD site. Included is the extern D (ok) and the extern C (fails). To compile open "compile.bat" and to run the programs use "run.bat".
>>> Try this:
>>> alias extern (C) void function(void*) MyDLL_Initialize_fp;
>>> alias extern (C) void function() MyDLL_Terminate_fp;
>>> alias extern (C) MyClass function() getMyClass_fp;
>>
>> Haha! cool man, thanx, it works.
>> I never though it could be the type but adding extern(C), the program treats variables as C function pointers. I had no idea at all that i can create extern(C) variables to be trated as C type. I learned something new today!
>> Thanks again.
>>
>
> It doesn't affect normal variables. Calling a function through a function pointer, the calling convention still must be known in order for parameters to be properly passed. So any time you define a function pointer to point to a C function or to pass to a C API as a callback, it must have the proper extern linkage.
Actually, extern(C) does affect normal variables. In particular, it affects their name mangling. (And if the type of the variable includes a 'raw' function pointer type (not an alias/typedef to one), I'm pretty sure it also modifies that type to use a C calling convention function pointer type)
The example above, though, does not directly affect any variables because they're only alias declarations.
|
Copyright © 1999-2021 by the D Language Foundation