Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
February 19, 2015 C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Is it possible to declare a function in D which gets the C++ calling convetion but not the C++ mangling? Kind Regards Benjamin Thaut |
February 19, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to Benjamin Thaut | On Thursday, 19 February 2015 at 18:25:10 UTC, Benjamin Thaut wrote:
> Is it possible to declare a function in D which gets the C++ calling convetion but not the C++ mangling?
>
> Kind Regards
> Benjamin Thaut
You can use pragma(mangle, ...) to set whatever mangling you like.
|
February 19, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Thursday, 19 February 2015 at 21:33:50 UTC, John Colvin wrote:
> On Thursday, 19 February 2015 at 18:25:10 UTC, Benjamin Thaut wrote:
>> Is it possible to declare a function in D which gets the C++ calling convetion but not the C++ mangling?
>>
>> Kind Regards
>> Benjamin Thaut
>
> You can use pragma(mangle, ...) to set whatever mangling you like.
I would duplicate the declaration, once without extern(C++), once with, the use the .mangleof from the 1st to set the mangle of the 2nd with pragma(mangle
|
February 20, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Thursday, 19 February 2015 at 21:34:57 UTC, John Colvin wrote:
>
> I would duplicate the declaration, once without extern(C++), once with, the use the .mangleof from the 1st to set the mangle of the 2nd with pragma(mangle
Yes that would work. But using pragma(mangle) feels so hacky...
|
February 20, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to Benjamin Thaut | On Friday, 20 February 2015 at 12:23:31 UTC, Benjamin Thaut wrote:
> On Thursday, 19 February 2015 at 21:34:57 UTC, John Colvin wrote:
>>
>> I would duplicate the declaration, once without extern(C++), once with, the use the .mangleof from the 1st to set the mangle of the 2nd with pragma(mangle
>
> Yes that would work. But using pragma(mangle) feels so hacky...
I agree. Wrap it in a mixin / mixin template?
Why do you need this? Presumably it'll be hidden in the depths of some library / bindings where beauty is somewhat optional? Using the .mangleof from an extern(D) function should mean it's robust.
|
February 20, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Friday, 20 February 2015 at 13:00:39 UTC, John Colvin wrote:
>
> I agree. Wrap it in a mixin / mixin template?
>
> Why do you need this? Presumably it'll be hidden in the depths of some library / bindings where beauty is somewhat optional? Using the .mangleof from an extern(D) function should mean it's robust.
Well the use case is creating a function which sole purpose it is to create a function pointer from it and pass it to C++. If it recieves C++ mangling however I have to pay attention that it does not conflict with any other C++ symbols. The same goes for extern(C). Sometimes you want to create functions with a C calling convetion so you can create a function pointer from it. With extern(C) its even a bigger problem because the C mangling conflicts a lot easier.
|
February 21, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to Benjamin Thaut | On Friday, 20 February 2015 at 13:40:12 UTC, Benjamin Thaut wrote:
> On Friday, 20 February 2015 at 13:00:39 UTC, John Colvin wrote:
>>
>> I agree. Wrap it in a mixin / mixin template?
>>
>> Why do you need this? Presumably it'll be hidden in the depths of some library / bindings where beauty is somewhat optional? Using the .mangleof from an extern(D) function should mean it's robust.
>
> Well the use case is creating a function which sole purpose it is to create a function pointer from it and pass it to C++. If it recieves C++ mangling however I have to pay attention that it does not conflict with any other C++ symbols. The same goes for extern(C). Sometimes you want to create functions with a C calling convetion so you can create a function pointer from it. With extern(C) its even a bigger problem because the C mangling conflicts a lot easier.
For C++, you can just use the newly added namespace support:
extern(C++, nobody.uses.this.name) myFunc() {}
|
February 21, 2015 Re: C++ calling convention only | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | Am 21.02.2015 um 11:30 schrieb "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm@gmx.net>":
>
> For C++, you can just use the newly added namespace support:
>
> extern(C++, nobody.uses.this.name) myFunc() {}
Thats actually a good idea. Thanks.
|
Copyright © 1999-2021 by the D Language Foundation