gpt4 book ai didi

c++ - C 或 C++ 链接器中是否有任何类型检查?

转载 作者:太空狗 更新时间:2023-10-29 19:48:17 27 4
gpt4 key购买 nike

我说链接器不检查函数参数是否正确。它们不检查函数调用的数量或类型,也不检查全局数据引用的类型。这对所有链接器都是正确的吗?

我在 x86-64 上使用面向 Linux 的 Clang。链接器是否检查引用是否在正确的段中?或者就链接器而言,外部引用实际上只是一个 void * 吗?

我来自高级语言背景 C# 和 Scala,所以对于那些沉浸在低级世界中的人来说,这似乎是显而易见的。我在汇编器中编写了几个函数(系统调用),我注意到在汇编器中没有外部函数的参数原型(prototype)。

上下文:我实际上是在编写一个编译器。目前我的目标是使用汇编函数进行系统调用的预处理 C .i 文件,但替代方案是 C++、汇编程序甚至机器代码,所以我试图权衡成本和 yield ,尤其是类型检查,汇编器/编译器/链接器我可以用来检查我自己的程序及其函数原型(prototype)生成的正确性。

最佳答案

正如@Yakk 所解释的,函数可以根据它们的参数进行重载,因此编译器会生成包含参数及其类型信息的错位函数名称。链接器主要只检查符号名称和大小,但由于重整可确保函数名称不同,因此不会链接不匹配的参数。

函数 返回类型 不是重整的一部分(因为重载返回类型是不合法的),所以如果你在一个翻译中声明 int test() unit 并在另一个中调用 float test(),链接器不会捕获它,你会得到不好的结果。

类似地,链接器不检查全局变量(和类的静态成员等)的类型,因此如果您在一个翻译单元中声明 extern int test; 并定义 float test; 在另一个中,你会得到不好的结果。

在某些情况下,链接器可以比较两个不同翻译单元中符号的大小,并可以通过这种方式发现一些问题。

在实践中,这在正常的 C++ 开发中很少成为问题,因为每当 >1 个翻译单元需要一个函数或变量或类时,您将在两个翻译单元都包含的头文件中声明它,并且编译器甚至会在链接器运行之前捕获任何错误。 (可能会出现问题的一个例子是,如果您使用的是外部二进制库,而您拥有的头文件与该库不匹配。)

关于c++ - C 或 C++ 链接器中是否有任何类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28090854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com