读书人

关于外部变量的有关问题!求指教!

发布时间: 2012-03-24 14:00:46 作者: rapoo

关于外部变量的问题!求指教!!!
如果我在两个不同的源文件中,写同样的一条这样的语句,比如char buf[100]; 那么编译器会怎么处理呢,哪一个作为定义呢?我知道正常的应该是某一个加上extern作为声明,但是我想知道如果我不加编译器怎么看待这两个语句呢?求高人指教,在下愚钝!!!

[解决办法]
file1.c 及 file2.c 会被分别编译为 file1.o 和 file2.o,在每一份 obj 里面都会有一个 char buf[100]
当在两个c文件里声明buf时都加了static关键字,则不论是在vc还是在gcc下链接都不会报错,且运行后,两份buf互不相干
如果都不使用static关键字,则在vc下会报link错误,会说buf在某个obj中已定义(以先被link的为主,后被link的就会与先被link的冲突)
但是在gcc下link不报错(即使打开了 -Wall),运行的情形显示为lz所说的情况,“两份”buf 内容变成一样的了经过简单调试,“两份”buf的地址是同一个,以先被link的obj中的那份buf为准,代码及简单调试见下帖

探讨

引用:
编译器不会保存 但是链接器时候会报错。

看 深入理解计算机系统--程序链接

我运行了程序,没有问题,链接没有报错,真的迷惘了

[解决办法]
根据<c缺陷与陷阱>一书描述:
如果一个程序对同一外部变量的定义不止一次,那么不同的系统会有不同的处理方式,大多数系统都会拒绝接受该程序.如果一个外部变量在多个源文件中定义却并没有指定初始值,那么某些系统会接受,而另外一些则不会接受.
因此,解决方法就是确保每个外部变量只被定义一次.

读书人网 >C语言

热点推荐