海湾合作委员会将外部连接不正确

gcc linking externs incorrectly?

本文关键字:外部 连接 不正确 委员会      更新时间:2023-10-16

我对GCC的新手相对较新,我正在使用'GCC(TDM-1(5.1.0'。我遇到了一个非常奇特的情况。我对一个非常小的可重复的例子缩小了我的关注...

main.cpp

extern int g;
int main(){
    return g;
}

somotherfile.cpp

#include<windows.h>
RECT g;

我用

编译这个
gcc -c someOtherFile.cpp
gcc main.cpp someOtherFile.o

这将链接而不会出错。

我在这里错过了为什么允许链接的东西?

3.5/10:

在所有类型的调整(在其中typedefs(7.1.3(被其定义替换(之后,所有参考给定变量或函数的声明指定的类型均应相同,除非数组对象的声明可以指定阵列类型因存在或不存在主要阵列结合而异(8.3.4(。违反此类型身份规则不需要诊断。

最后一句话意味着编译器和链接器不需要给您错误消息。保持直率是您的工作。

在C 中它不会链接,因为g的类型是main.cpp和hotherfile.cpp之间的不匹配。您必须在某个hotherfile.cpp中或对面有 int gextern RECT g; in main.cpp。

在C中,这将编译和链接,但在C 中。com编译和链接为C :

g++ -c someOtherFile.cpp
g++ -c main.cpp
g++ main.o someOtherFile.o -o test

另外,您可以为此使用功能:

main.cpp

int g();
int main{
    return g();
}

somotherfile.cpp

#include<windows.h>
RECT r;
int g()
{
    return (int)r;
}

显然不建议使用(因为没有太多的要点对int的矩(,但这与您尝试做的事情相似。

someOtherFile.cpp内部的变量g与main.cpp中声明的其他extern int g无关。实际上,int g根本没有在任何地方定义,因此链接将在最后失败。

显然,这实际上将通过G 进行编译和链接,而Microsoft Linker会在此类型的错误上错误。