【问题标题】:Is it possible for a C method not be able to be included in a C++ project?是否有可能无法将 C 方法包含在 C++ 项目中?
【发布时间】:2014-11-04 04:16:48
【问题描述】:

我知道我可以使用 extern "C" 东西在 C++ 项目中包含 C 方法。但是现在让我们假设我正在考虑创建一个 C++ 项目,该项目将使用大量 C 方法,这些方法来自我制作的库以及其他人/公司制作的库,其开发细节和编译规范我是根本不知道。

C 库的某些方法是否有可能无法包含在我的 C++ 项目中,其编译和配置细节未知,extern "C"?或者在使用extern "C" 的情况下,是否所有的 C 方法都必须 100% 兼容 C++ 代码?

【问题讨论】:

  • 顺便说一句,C 有“功能”,而不是“方法”。
  • 我遇到的唯一问题是,如果您有名称是 C++ 保留字的 C 函数,例如class()new()。否则它应该会按预期工作。
  • @Momergil 谁在谈论数学?
  • @Momergil 您如何看待 C 和 C++ 中的 int 变量仅支持有限的位数,即使类型名称显然是“整数”的缩写形式? :)
  • C++ 标准中使用的术语是函数。 C++ 根本不使用术语“方法”——甚至类内部的东西也称为成员函数。

标签: c++ c extern-c


【解决方案1】:

C 导出的某些函数可能使用与 C++ 关键字冲突的名称。您将无法使用extern "C" 声明那些。

汇编器导出的函数甚至可以使用与 C 关键字冲突的名称。

那些声明为静态的函数仍然可以通过函数指针调用,只要库为您提供了一种获取方法。

由于同样的原因,可能无法在 C++ 模式下解析标头——例如 restrict 关键字。

除了命名问题,C++ 完全支持 C 调用约定。这就是extern "C" 的意义所在。

【讨论】:

    【解决方案2】:

    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++ 编译单元中。

    【讨论】:

    • 是的,这是事实;刚刚在我的一个 C++ 项目中对其进行了测试。谢谢!
    【解决方案3】:

    虽然不太可能,但在原地extern "C" 可能出现的一个可能问题是,当声明为extern "C" 的函数指针指向未声明为extern "C" 的C++ 函数时。有关详细信息,请参阅此page 的最后部分。

    【讨论】:

    • 如果一个 C 函数接受一个函数指针作为参数,如果你给它一个指向 C++ 函数的指针,一些编译器可能会窒息。我记得在某处读过它。
    • 作为一个体面的答案,这应该更准确,而不仅仅是道听途说。
    • @JensGustedt 好点,谢谢。我已包含参考。
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-09-17
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多