extern "C"
我知道我可以使用这个东西在 C++ 项目中包含 C 方法。但是现在让我们假设我正在考虑创建一个 C++ 项目,该项目将使用大量 C 方法,这些方法来自我制作的库以及其他人/公司制作的库,其开发细节和编译规范我是根本不知道。
是否有可能某些具有未知编译和配置细节的 C 库方法无法包含在我的 C++ 项目中extern "C"
?还是所有 C 方法都必须 100% 兼容 C++ 代码extern "C"
?
C 导出的某些函数可能使用与 C++ 关键字冲突的名称。您将无法使用extern "C"
.
汇编器导出的函数甚至可以使用与 C 关键字冲突的名称。
那些声明为静态的函数仍然可以通过函数指针调用,只要库为您提供了一种获取方法。
出于同样的原因,标头在 C++ 模式下可能无法解析——比如restrict
关键字。
除了命名问题,C++ 完全支持 C 调用约定。这extern "C"
就是全部。
C 具有与 C++ 不兼容的接口结构,尤其是可变长度数组。在现代 C 中,你会写
void matMult(size_t n, size_t k, size_t m, double A[n][k], double B[k][m], double C[n][m]);
此接口不能包含在 C++ 编译单元中。
尽管不太可能,但extern "C"
就地可能出现的一个问题是,当声明的函数指针指向extern "C"
未声明的 C++ 函数时extern "C"
。有关详细信息,请参阅本页的最后部分。