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内容自动编写包装器)。

我测试了模板文本函数解决方案(没有参数类型的函数文本)并且它工作正常,没有运行时错误。