How to get a function name (string) @ compile time

Daniel Ribeiro Maciel daniel.maciel at gmail.com
Sun Nov 2 17:11:20 PST 2008


Denis Koroskin Wrote:

> On Mon, 03 Nov 2008 01:59:56 +0300, Daniel Ribeiro Maciel  
> <daniel.maciel at gmail.com> wrote:
> 
> > How do we get a function name (string) @ compile time?
> >
> > I need to do stuff like (in C)
> >
> > #include <stdio.h>
> >
> > #define HELLO( func ) \
> >   printf( "calling " #func "\n" ); \
> >   func();
> >
> > void foo()
> > {
> > 	printf( "@foo" );
> > }
> >
> > int main()
> > {
> > 	HELLO( foo );
> > 	printf( "\n" );
> > }
> >
> > The output is:
> > calling foo
> > @foo
> >
> > Thanks in advance,
> > Daniel
> >
> 
> Just in case you know little D here is the source code, explanation and  
> comparison to C++:
> 
> import std.stdio; // this is used to import writefln() - a function  
> similar to printf (but typesafe)
> 
> // this is a template function that takes almost anything (close to C++  
> templates and C macros)
> void print(alias functionName)()
> {
>      // stringof is used to take a string representation of the identifier
>      writefln("Calling ", functionName.stringof);
> 
>      // let's invoke it! This will succeed if functionName is a function,  
> pointer to function,
>      // delegate or an object that have overloaded opCall() (similar to C++  
> operator())
>      functionName();
> }
> 
> void foo()
> {
>      writefln("@foo"); // same as printf("@foo);
> }
> 
> void main()
> {
>      // foo is a global (free) function. it is passed to the template  
> function.
>      // In C++ you would do print<foo>(); (but C++ doesn't support  
> specializing
>      // templates with functions nor does it have .stringof)
>      print!(foo);
> }

Thanx a lot! It worked for some functions.

I found a problem though. If we change foo to:

void foo( double i )
{
     writefln("@foo ", i );
}

the compiler yields an error:

test.d(30): function app.sandbox.main.foo (double i) does not match parameter types ()
test.d(30): Error: expected 1 arguments, not 0]

line 30 is this:      writefln("Calling ", functionName.stringof);

Is this supposed to be a bug?

Best regards,
Daniel



More information about the Digitalmars-d-learn mailing list