【问题标题】:Limitations to functions declared as `extern "C"`? C++ features still usable?声明为`extern "C"`的函数的限制? C++ 功能仍然可用吗?
【发布时间】:2013-03-17 10:34:41
【问题描述】:

extern "C" 除了指定不应该被破坏的标识符之外,是否还做了更多的事情?

在声明为extern "C" 的函数中是否可以使用 C++ 功能?

【问题讨论】:

    标签: c++ c language-features extern


    【解决方案1】:

    它只影响名称修改,以便其他应用程序可以清楚地看到外部可见性。

    【讨论】:

    • 但是它们还能超载吗?或者他们可以返回 C++ 对象吗?
    • @H2CO3 - 它们不会超载,例如我将手动进行重载,但返回 C++ 对象的要点适用。
    • extern "C" 可能也会影响调用约定,它肯定会影响不同命名空间之间的可见性和名称冲突。
    • 不,它们不能超载,标准是这样说的。
    【解决方案2】:

    extern "C" 不是表示编译为 C 代码。这意味着该函数应该被编译以便可以从C代码中调用;实际影响的是实现相关的。在这样的函数中,你可以在 C++ 中做的任何事情都很好,包括抛出异常。

    【讨论】:

    • 我意识到有点晚了,但是模板呢?它们不可能在 extern 声明中工作,因为它禁止名称修改?
    【解决方案3】:

    您不应该从它们那里抛出异常,否则您可以使用尽可能多的 C++ 特性来实现 extern "C" 函数的主体。

    这很好:

    MyObject myobj;
    extern "C" { 
        int myfunc(char *c) 
        {    // c++ features used here
            std::string s = myobj.method(....
        }
    }
    

    【讨论】:

    • 我使用的框架 - Qt 正在处理的异常呢?
    • 异常不应跨越extern "C" 边界,因为您无法确定调用者是否可以处理它们,或者即使调用者是用 C++ 编写的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多