【问题标题】:Do C++ and C use the same kind linker?C++ 和 C 是否使用相同类型的链接器?
【发布时间】:2017-02-19 23:20:55
【问题描述】:

如题,C++和C在链接过程中是否使用同一种链接器?还有,对于C++和C的编译器,C++编译器是建立在C编译器之上的吗?

【问题讨论】:

  • 链接根本不是编译过程的一部分。链接是一个完全不同的过程,它发生在编译完成之后。如果 C++ 编译器是在 C 编译器之上构建的,或者它是从头开始构建的,则取决于我们正在谈论的编译器。其中许多是封闭源代码,因此我们没有直接的了解方式。此外,这不是 C++ 或 C 问题。
  • gnu 编译器套件:是的,gcc 和 g++ 使用相同的链接器:ld
  • @VadaPoché 为什么这不是 C++ 或 C 问题?它与代码无关,与编译无关,但如果不链接大多数代码,大多数编译都是无用的。恕我直言,标签在这里完全相关
  • 我猜你的意思是“kind of”而不是“kind”,后者有同情的意思。但是我不敢编辑,因为我无法决定要么完全删除它,要么将其更正为“某种”,因为那是完全不同的问题
  • 不仅 C 和 C++ 使用相同的链接器,而且(至少对于 Microsoft 品牌而言),相同的链接器用于 Fortran、COBOL 以及 Microsoft 生产的大多数其他编译语言。跨度>

标签: c++ c linker


【解决方案1】:

两种实现都使用相同的链接器。但是,C++ 必须对所链接事物的名称和类型进行编码,以支持函数重载,从而不能将它们与错误的函数链接。所以,如果你有两个这样的 C++ 函数:

 void func( int );
 void func( int, double);

然后 C++ 编译器将为这些函数生成名称,例如 func_intfunc_int_double。生成的确切名称是编译器特定的,C++ 标准没有指定。由于 C 不支持重载,因此 C 中不需要这种机制,但如果您想将 C++ 代码与 C 链接起来,则需要关闭这种所谓的名称修饰,这就是 extern "C" 构造所做的。

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2023-03-19
    • 2010-12-12
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多