链接器如何解析链接?

时间:2013-09-13 09:56:08

标签: c linker linkage

我有两个翻译单元..

file1.c中

#include<stdio.h>
#include<string.h>
extern char a[90];

int main(int argc,char ** argv){


//printf("%s ",a);

strcat(a,"y Code");
printf("%s",a);
return 0;
}

file2.c中

char a[4]={'Q','u','i','r'};

通过项目的编译和链接没有错误,但是当我对程序进行了优化时,它会给出分段错误错误(在调试模式下)。 我认为链接器如何解决file1.c中标识符a的错误链接以定义文件2中的错误链接,这种情况发生在我也改变了file2.c的数据类型(a的定义)如何可能,链接器用于链接相同或不同转换单元中的标识符的机制是什么?

2 个答案:

答案 0 :(得分:0)

您收到了细分错误,因为您已定义char a[4]并且您已extern char a[90]

您还需要使用-Wall启用警告,在链接步骤中,编译器会识别此变量,因此您不会收到任何错误。

答案 1 :(得分:0)

您可以在file1.c

中声明不完整类型的对象
extern char a[];

然后在file2.c

中使用完整类型定义它
char a[4]={'Q','u','i','r'};

这意味着同一个数组对象最初可能具有不完整的类型,但稍后会获得完整的类型。当然,这并不意味着您可以将a声明为int,然后将其定义为double。你在这里唯一与类型相关的自由是完成一个不完整的类型。没有了。

礼貌:Shouldn't declaration match its definition when array is involved?

但是,您可能希望避免连接到未知长度的char数组。