【问题标题】:How does the compiler and linker handle classes and functions编译器和链接器如何处理类和函数
【发布时间】:2017-11-19 13:48:56
【问题描述】:

有人可以帮我理解一下,为什么我可以在两个不同的编译单元中拥有相同的类而不会出现链接器错误,但在不同的编译单元中却没有相同的功能?

提前非常感谢。

【问题讨论】:

  • 通常,链接器对类一无所知。
  • @OliverCharlesworth IIRC MSDN 对成员函数有特殊的调用/修改约定,所以从某种意义上说,它们确实如此。
  • 类不生成代码。函数可以。

标签: c++ templates linker compilationunit


【解决方案1】:

两个组合单元中的同一个类很可能会由于其具有相同名称的方法(包括特殊成员,如默认 ctor 或 operator=)的一个定义错误而导致格式错误的程序。

我的特殊成员函数是隐式内联定义的,因此我们很容易得到不需要诊断的格式错误的程序。

我因此而损坏了内存;两个同名不同内存布局的矩阵类。

【讨论】:

    【解决方案2】:

    通常,链接器主要了解函数和变量(非成员变量)。

    链接器持有的关于类的信息通常与继承的实现有关。成员函数被转换为常规函数,带有额外的隐式 this 参数。访问成员通常只是this 指针的偏移量。

    但是,如果您将继承添加到您的类,或者使用 typeid 或 type_info,您可能会开始遇到许多奇怪的行为。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多