Return by 'ref' problems...
Artur Skawina
art.08.09 at gmail.com
Sat May 5 14:28:22 PDT 2012
On 05/05/12 12:10, Manu wrote:
> On 5 May 2012 09:09, Artur Skawina <art.08.09 at gmail.com <mailto:art.08.09 at gmail.com>> wrote:
>
> On 05/05/12 01:32, Manu wrote:
> > On 4 May 2012 21:51, Artur Skawina <art.08.09 at gmail.com <mailto:art.08.09 at gmail.com> <mailto:art.08.09 at gmail.com <mailto:art.08.09 at gmail.com>>> wrote:
> >
> > On 05/04/12 15:57, Manu wrote:
> > > Yeah I really hate this too. I'd like to see const(T) strictly enforced, considering the potential for ambiguity in other situations.
> > >
> > > But I'm still stuck! :(
> > > How can I do what I need to do?
> >
> > If 'auto' is not an option:
> >
> > alias ref const(S) function() FT;
> > FT fp;
> >
> > (it's needed for things like 'extern (C)' too)
> >
> >
> > Huzzah! This is indeed the solution! I haven't seen another solution that works. now I just need to make sure I generate a unique name for the alias...
> >
> > I don't think this is needed for extern (C), I declare extern (C) function pointers all the time without any trick..?
>
> void f(extern (C) int function(double) a);
The compiler won't directly accept "void f(extern (C) int function(double) a)" when declaring
or defining the function, so the extra alias step is necessary, like in your 'ref' case.
> Hmm, actually, this makes me question my code...
>
> struct Thing
> {
> extern (C) void function() funcPtr;
> }
>
> Have I declared a pointer to an extern(C) function, or have I declared an extern(C) variable funcPtr that is a regular D-call function?
> extern(C) variables only really make sense in the global scope, where they would have C-style name mangling applied...
alias extern (C) void function() F;
F f1;
extern (C) F f2;
'f1' is a D pointer a C function, 'f2' is a C pointer to C function (ie f2's name isn't mangled).
extern (C) void function() f3;
f3 is a C pointer to C function (think 'extern (C) { void function() f3; }').
alias void function() DF;
extern (C) DF f4;
f4 is a C pointer to a D function.
I'd stick to the alias method for every case where the difference actually matters...
artur
More information about the Digitalmars-d
mailing list