原创作者: qiezi
阅读:793次
评论:0条
更新时间:2011-05-26
在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不能获得它的名字,这点和C++相似。
不过今天看到PyD的一个例子:
看到什么了?它如何能获取hello_func这个名字?而在python扩展中使用?
D语言各种类型都有一个mangleof属性,返回一个经过mangling过的名字,如果你在链接一个程序时提示找不到符号,可能会遇到这个,比如“PFC3eee42__T19mangle_helper_classS14_D3eee4testFZvZ19mangle_helper_classZv”这个名字就是经过编译器mangling过的。
简单追踪代码,发现它在meta包里实现了一些功能,其中有个叫 manglenameof,可以获取方法名字。没有简单方法获取吗?
简单测试一下:
发现test.mangleof返回的是"v",也就是 void类型这实际上是test方法调用后的类型,不过并不真的调用test方法,而是和sizeof一样,在编译器决议出来,它和(test()).mangleof是等价的。(&test).mangleof则返回"PFZv",根本不包含名字信息。
接下来测试的是2种,模板类和模板方法:
直接实例化:
第2种是可以获取到的,在我这里它返回的名字是“C3eee42__T19mangle_helper_classS14_D3eee4testFZiZ19mangle_helper_class”
只要把不相关的名字抹掉就可以得到test。不过pyd使用了一个更麻烦的:
也可以获取。
对于D这种元信息十分贫乏的语言来说,能够做到这个已经很不容易了。
不过今天看到PyD的一个例子:
import pyd.pyd; import std.stdio; void hello_func() { writefln("Hello, world!"); } extern (C) void PydMain() { def!(hello_func); module_init(); }
>>> import testdll >>> testdll.hello_func() Hello, world!
看到什么了?它如何能获取hello_func这个名字?而在python扩展中使用?
D语言各种类型都有一个mangleof属性,返回一个经过mangling过的名字,如果你在链接一个程序时提示找不到符号,可能会遇到这个,比如“PFC3eee42__T19mangle_helper_classS14_D3eee4testFZvZ19mangle_helper_classZv”这个名字就是经过编译器mangling过的。
简单追踪代码,发现它在meta包里实现了一些功能,其中有个叫 manglenameof,可以获取方法名字。没有简单方法获取吗?
简单测试一下:
void test(){}
发现test.mangleof返回的是"v",也就是 void类型这实际上是test方法调用后的类型,不过并不真的调用test方法,而是和sizeof一样,在编译器决议出来,它和(test()).mangleof是等价的。(&test).mangleof则返回"PFZv",根本不包含名字信息。
接下来测试的是2种,模板类和模板方法:
class mangle_helper_class(alias A){ } void mangle_helper_func(alias A)(){ }
直接实例化:
writefln((&mangle_helper_func!(test)).mangleof); writefln((mangle_helper_class!(test)).mangleof);
第2种是可以获取到的,在我这里它返回的名字是“C3eee42__T19mangle_helper_classS14_D3eee4testFZiZ19mangle_helper_class”
只要把不相关的名字抹掉就可以得到test。不过pyd使用了一个更麻烦的:
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这种元信息十分贫乏的语言来说,能够做到这个已经很不容易了。
评论 共 0 条 请登录后发表评论