Thread overview
extern(C) function literals for stubs
Jan 22, 2014
Marco Leise
Jan 22, 2014
bearophile
Jan 22, 2014
Marco Leise
Jan 22, 2014
Marco Leise
January 22, 2014
Can I define them somehow? The use case is defining extern C functions that contain code to load the real thing from a library.

  nothrow extern(C) void function(int) someFunc = ???

-- 
Marco

January 22, 2014
Marco Leise:

> Can I define them somehow? The use case is defining extern C
> functions that contain code to load the real thing from a
> library.
>
>   nothrow extern(C) void function(int) someFunc = ???

Perhaps you want:

extern(C) nothrow void someFunc(int someArg);

Bye,
bearophile
January 22, 2014
Am Wed, 22 Jan 2014 17:52:03 +0000
schrieb "bearophile" <bearophileHUGS@lycos.com>:

> Marco Leise:
> 
> > Can I define them somehow? The use case is defining extern C functions that contain code to load the real thing from a library.
> >
> >   nothrow extern(C) void function(int) someFunc = ???
> 
> Perhaps you want:
> 
> extern(C) nothrow void someFunc(int someArg);
> 
> Bye,
> bearophile

Thanks, but I want it to be a function pointer so I can swap it from within the function literal in the fashion of

  nothrow extern(C) void function(int) someFunc = (int arg) {
      someFunc = GetProcAddress("someFunc");
      someFunc(arg);
  }

-- 
Marco

January 22, 2014
Am Wed, 22 Jan 2014 17:52:03 +0000
schrieb "bearophile" <bearophileHUGS@lycos.com>:

> Marco Leise:
> 
> > Can I define them somehow? The use case is defining extern C functions that contain code to load the real thing from a library.
> >
> >   nothrow extern(C) void function(int) someFunc = ???
> 
> Perhaps you want:
> 
> extern(C) nothrow void someFunc(int someArg);
> 
> Bye,
> bearophile

Got it now. By declaring the literal stub function in a template instead I can use the normal function declaration syntax without introducing a new symbol at the definition site:

{
  ...
  nothrow extern(C) void function(int) someFunc = &Stub!someFunc;
  ...
}

nothrow extern(C) auto Stub(alias func)(ParameterTypeTuple!func args)
{
	debug printf("Loading %s...\n", func.stringof.ptr);
	return (func = &impl)(args);
}


-- 
Marco