【发布时间】:2013-03-17 10:34:41
【问题描述】:
extern "C" 除了指定不应该被破坏的标识符之外,是否还做了更多的事情?
在声明为extern "C" 的函数中是否可以使用 C++ 功能?
【问题讨论】:
标签: c++ c language-features extern
extern "C" 除了指定不应该被破坏的标识符之外,是否还做了更多的事情?
在声明为extern "C" 的函数中是否可以使用 C++ 功能?
【问题讨论】:
标签: c++ c language-features extern
它只影响名称修改,以便其他应用程序可以清楚地看到外部可见性。
【讨论】:
extern "C" 可能也会影响调用约定,它肯定会影响不同命名空间之间的可见性和名称冲突。
extern "C" 不是表示编译为 C 代码。这意味着仅该函数应该被编译以便可以从C代码中调用;实际影响的是实现相关的。在这样的函数中,你可以在 C++ 中做的任何事情都很好,包括抛出异常。
【讨论】:
您不应该从它们那里抛出异常,否则您可以使用尽可能多的 C++ 特性来实现 extern "C" 函数的主体。
这很好:
MyObject myobj;
extern "C" {
int myfunc(char *c)
{ // c++ features used here
std::string s = myobj.method(....
}
}
【讨论】:
extern "C" 边界,因为您无法确定调用者是否可以处理它们,或者即使调用者是用 C++ 编写的。