知识若不分享    实在没有意义

查看完整版本: 如何获得一个方法的名字

yidabu 2007-4-28 18:58

如何获得一个方法的名字

如何获得一个方法的名字知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070428点击下面网址查看原文:http://www.d-programming-language-china.org        by:        qiezi        from:        http://qiezi.javaeye.com/blog/47489        在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不能获得它的名字,这点和C++相似。        不过今天看到PyD的一个例子:        [Copy to clipboard] [ - ]CODE:                                import pyd.pyd;                import std.stdio;                                void hello_func() {                    writefln("Hello, world!");                }                                extern (C) void PydMain() {                    def!(hello_func);                    module_init();                }                代码        [Copy to clipboard] [ - ]CODE:                                >>> import testdll                >>> testdll.hello_func()                Hello, world!                看到什么了?它如何能获取hello_func这个名字?而在python扩展中使用?        D语言各种类型都有一个mangleof属性,返回一个经过mangling过的名字,如果你在链接一个程序时提示找不到符号,可能会遇到这个,比如“PFC3eee42__T19mangle_helper_classS14_D3eee4testFZvZ19mangle_helper_classZv”这个名字就是经过编译器mangling过的。        简单追踪代码,发现它在meta包里实现了一些功能,其中有个叫 manglenameof,可以获取方法名字。没有简单方法获取吗?( 本文出处: http://www.d-programming-language-china.org )        简单测试一下:( 本文出处: http://www.d-programming-language-china.org )        [Copy to clipboard] [ - ]CODE:                                void test(){}                发现test.mangleof返回的是"v",也就是 void类型这实际上是test方法调用后的类型,不过并不真的调用test方法,而是和sizeof一样,在编译器决议出来,它和(test()).mangleof是等价的。(&test).mangleof则返回"PFZv",根本不包含名字信息。        接下来测试的是2种,模板类和模板方法:        [Copy to clipboard] [ - ]CODE:                                class mangle_helper_class(alias A){                }                                void mangle_helper_func(alias A)(){                }                直接实例化:        [Copy to clipboard] [ - ]CODE:                                writefln((&mangle_helper_func!(test)).mangleof);                writefln((mangle_helper_class!(test)).mangleof);                第2种是可以获取到的,在我这里它返回的名字是“C3eee42__T19mangle_helper_classS14_D3eee4testFZiZ19mangle_helper_class”( 本文出处: http://www.d-programming-language-china.org )        只要把不相关的名字抹掉就可以得到test。不过pyd使用了一个更麻烦的:        [Copy to clipboard] [ - ]CODE:                                class mangle_helper_class(alias A){                }                                void mangle_helper(alias A)(mangle_helper_class!(A)){                                }                                template manglenameof(alias A){                    const char[] manglenameof = (&mangle_helper!(A)).mangleof;                }                也可以获取。        对于D这种元信息十分贫乏的语言来说,能够做到这个已经很不容易了。( lastupdate:20070428 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: 如何获得一个方法的名字