亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 關(guān)于項目中全局變量的疑問,不解啊 [打印本頁]

作者: demaple    時間: 2010-10-27 13:32
標題: 關(guān)于項目中全局變量的疑問,不解啊
項目有4個c程序,2個h頭文件。
a.c內(nèi)容是

  1. #include "ee.h"
  2. #include "ff.h"
  3. int fun_a(int a)
  4. {
  5.    return a;
  6. }
復(fù)制代碼
b.c內(nèi)容

  1. #include "ee.h"
  2. #include "ff.h"
  3. int fun_b(int a)
  4. {
  5.    return a;
  6. }
復(fù)制代碼
cc.c內(nèi)容

  1. #include "ff.h"
  2. int dd;
復(fù)制代碼
aa.c是主程序

  1. #include <stdio.h>
  2. #include "ee.h"
  3. int main()
  4. {
  5.    dd =0;
  6.    fun_a(10);
  7.    fun_b(10);
  8.    printf("hell\n");
  9. }
復(fù)制代碼
ee.h是

  1. int fun_a(int a);
  2. int fun_b(int b);
  3. extern int dd;
復(fù)制代碼
ff.h是

  1. extern int dd;
復(fù)制代碼
編譯順序是
g++ -c a.c b.c cc.c
ar rv libb.a b.o cc.o
ar rv liba.a a.o cc.o
g++ -o aa aa.c -L. -la -lb,則不報錯
如果取消cc.c改為把int dd放在頭文件里,則報dd重復(fù)定義。重復(fù)定義我理解原因。但是不明白為什么兩個.a里都有dd的定義,而不報錯?
作者: lsupper    時間: 2010-10-27 16:53
我想應(yīng)該是你在:
ar rv libb.a b.o cc.o
ar rv liba.a a.o cc.o
的時候,生成的兩個*.a里面都有了定義了,并且你ar的時候是單獨的...所以...
作者: fender0107401    時間: 2010-10-27 16:56
lz手工敲gcc?
作者: star1983653    時間: 2010-10-27 17:08
預(yù)處理的時候,把ee.h都展開,就出現(xiàn)了2個int dd了。
另外,你的班上有個人叫張三,隔壁班也有個張三,這是完全沒有問題的。
兩個班突然要合并,就出問題了。2個張三搞不清楚了。
作者: donotblock    時間: 2010-10-27 18:52
樓上的,樓主應(yīng)該是問問什么link里面包含了兩個cc.o 卻不報重復(fù)定義

查了下文檔:
The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined.

http://gcc.gnu.org/onlinedocs/gc ... s.html#Link-Options

猜測是因為粗體字部分, 掃描archive file時只掃描還未被定義的符號,先掃描liba.a, 發(fā)現(xiàn)了int dd, libb.a里面的cc.o就不掃描了。 不知道對不對
作者: demaple    時間: 2010-10-28 14:08
回復(fù) 5# donotblock


    應(yīng)該是這樣理解,才能通!




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2