C++中所谓的“类型安全链接”是什么?

4
在《C++编程思想》一书中提到了类型安全链接,但并不是很清楚。能否有人详细解释一下呢? 谢谢。

这个问题可能更适合在程序员上发布。 - GoBusto
http://en.wikipedia.org/wiki/Name_mangling - Barmar
2个回答

5

类型安全链接在链接时强制传递正确的参数数量和类型。

例如,在C中,您可以将库函数定义为接受int类型的参数,但通过一系列纰漏,您可以传递一个字符串。

C++通过强制使用函数原型并使用名称重整来避免这种错误以实现类型安全链接。来源

让我们通过一个例子来看看

//:Def.cpp
void f(int) {}

//Use.cpp
// Function misdeclaration
void f(char);

int main() {
  f(1); // Causes a linker error
} 

这个函数实际上是 f(int),但编译器并不知道这一点,因为它被显式声明为 f(char)。在 C 中,编译器会成功,链接器也会成功,但在 C++ 中则不然。

这里还有一个非常详细的解释:http://www.hpc.unimelb.edu.au/nec/g1af05e/chap9.html


2
请透露您的来源,即什么是类型安全链接? - Sebastian Dressler
1
严格来说:C++不需要名称重整(如果您可以修改链接器,则有更好的解决方案)。 - James Kanze
@JamesKanze:该死的“修改链接器”。听起来很有趣 :) - Ankur
当人们谈论“类型安全链接”时,通常指的是与现有(为C设计的)链接器进行类型安全链接。但是如果你仔细想一想:这些信息没有必要混杂在函数名中(也没有理由不出现在变量上);大多数现代对象格式都是为C设计的,并且没有这种信息的字段,但实际上并没有真正的理由不这样做。 - James Kanze
因此,编译器(无论是C还是C++)无法找到此错误,但链接器(仅在C++中)可以停止警告您。我理解您的意思:) - EXLsunshine

1
Type-safe linkage要求在链接时必须提供正确数量和类型的参数。以C语言为反例,您可以定义一个接受double的函数,但意外传递了一个complex。在C++中,由于具有类型安全的链接,这种情况是不可能发生的。有关参考,请查看C ++的类型安全链接编辑总结:C++使用名称重载。这也使函数重载成为可能,其中函数签名必须是唯一的。

我明白了你的意思,我会阅读参考资料。非常感谢。 :) - EXLsunshine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接