【发布时间】:2016-08-11 22:56:27
【问题描述】:
我正在玩弄 gcc 和 g++ 编译器并尝试在其中编译一些 C 代码,我的目的是看看编译器/链接器是如何强制执行的将具有某些函数声明的模型链接到具有该函数的实现的模型,正确的函数被链接(就传递的参数和返回的值而言)
例如让我们看看这段代码
#include <stdio.h>
extern int foo(int b, int c);
int main()
{
int f = foo(5, 8);
printf("%d",f);
}
在我的符号表中编译后,我会有一个 foo 的符号,但是在 elf 文件格式中,没有地方描述所采用的参数和函数签名(int(int,int)),所以基本上如果我写一些其他代码如:
char foo(int a, int b, int c)
{
return (char) ( a + b + c );
}
编译那个模型,它也会有一些叫做 foo 的符号,如果我把这些模型链接在一起,会发生什么?我从来没有想过这一点,编译器将如何克服这个弱点......我知道在 g++ 中,编译器会为每个符号生成一些与其命名空间有关的前缀,但它是否也考虑到签名?如果有人遇到过这个问题,如果他能阐明这个问题,那就太好了
【问题讨论】:
-
您已使用 C 标记,但询问 C++。它们是不同的语言,答案可能会有所不同,具体取决于您真正询问的语言。请澄清。
-
不清楚。您在任何地方都没有提到“在 g++ 中编译 c”。您确实意识到 C++ 代码可能看起来像 C 代码但根本不是一回事吗?因此,“在 g++ 中编译 C”本身并不清楚 - 如果您编译 g++ 中所示的代码,那么根据定义,它是 C++ 代码而不是 C 代码。使用 g++ 编译 C 代码需要额外的语法。如果你不明白这意味着什么,那么建议你研究一下。这一点实际上对您的问题非常重要,需要说清楚。
-
C 和 C++ 是不同的语言。关于这些语言,您的问题特别不同。所以选择其中一个!
-
我同意你的观点,也许应该编辑标题但故意没有在 C++ @Olaf 下标记
-
那么答案是错误的。