dmd没问题,ldc的.
我有带声明的.di,及从它们生成存根函数和全局指针的单独模块:
__gshared extern(C) static void* dpford_funcp_DMANGLE;
pragma(mangle, "DMANGLE")
void dpford_func_DMANGLE() {
asm{
naked;
jmp dpford_funcp_DMANGLE;
}
}
我非常不想用特征生成函数体.我试用ldc.attributes.naked,但同样如此.
这是生成函数的串片段.
mixin({
import std.array;
string result = q{
__gshared extern(C) static void* dpford_funcp_DMANGLE;
pragma(mangle, "DMANGLE")
void dpford_func_DMANGLE() {
asm{
naked;
jmp dpford_funcp_DMANGLE;
}
}
};
return result.replace("DMANGLE", n.mangleof);
}());
函数声明
//api.di
module api;
enum SorrelAPI;
@SorrelAPI
int testFunc(int, int);
mixin模板中,另一模块从该模块中读取更改后的函数名.
好吧,你正在为所有包装器用void()签名.如果不想用正确签名(可从n继承),则要避免用正确类型的声明和包装器模块编译模块到单个目标文件,来避免LDC检测到签名不匹配.因此,如果有多个只包含这些mixin的包装器模块,则单独编译到它们自己的目标文件/静态库应可工作.










