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
的包装器模块
,则单独编译
到它们自己的目标文件/静态库
应可工作.