D 可以在内联函数中指定extern吗?
我有一个函数类型D 可以在内联函数中指定extern吗?,d,D,我有一个函数类型alias Func=extern(C)void function()和接收Func作为参数的函数extern(C)void which(Func)。调用任何东西时,是否可以创建带有extern(C)链接的内联函数 例如: Func x = function() {} whatever(x); //Works whatever(function() {}); // Compilation error, invalid linkage 是的。。。但仅当Func接受一个参数并且您定
alias Func=extern(C)void function()代码>和接收Func作为参数的函数extern(C)void which(Func)代码>。调用任何东西时,是否可以创建带有extern(C)链接的内联函数
例如:
Func x = function() {}
whatever(x); //Works
whatever(function() {}); // Compilation error, invalid linkage
是的。。。但仅当Func
接受一个参数并且您定义内联函数而不指定该参数的类型时
extern(C) alias Func = void function(int);
extern(C)
void foo(Func f) {
}
void main() {
Func x = function(a) {};
pragma(msg, typeof(x));
foo(x);
foo(function(a) {});
}
这很有效。我在dlang.org上做过的其他事情都没有做过,看看语法,它没有说它允许内联函数上的extern
单词,所以我认为我没有遗漏任何东西(尽管我总是有可能遗漏)
参数one起作用的原因是,当您在函数文本中未指定参数类型时,编译器会将其设置为模板文本,并在传递时自动使用接收函数所期望的类型进行实例化
因为接收函数需要extern(C)
,所以模板也可以免费获得它
请注意,我还没有试着运行它,可能它编译了,但在运行时做了错误的事情
然而,我不相信对于零参数内联函数有任何类似的技巧
您可能还可以编写一个全局级模板来包装给定函数并返回该函数。瞧:
extern(C) alias Func = void function();
extern(C)
void foo(Func f) {
}
template wrap(alias f) {
extern(C) void wrapped() {
// you can also put stuff like try/catch
// in here if you like so exceptions don't
// accidentally pass through the C function
return f();
}
Func wrap() {
return &wrapped;
}
}
void main() {
Func x = function() {};
pragma(msg, typeof(x));
foo(x);
foo(wrap!(function() {}));
}
包装器解决方案也有优点和缺点,比如能够在普通D函数上添加try/catch或use,但缺点是您需要实际使用包装器并编写它(尽管您可以使用std.traits内容自动编写包装器)。我测试了模板文本函数解决方案(没有参数类型的函数文本)并且它工作正常,没有运行时错误。