[問題] extern變數赋值給另一個檔案的變數初始化

看板C_and_CPP作者 (沒有暱稱)時間6年前 (2018/05/29 14:15), 編輯推噓0(005)
留言5則, 2人參與, 6年前最新討論串1/1
Win10 TDM-GCC 4.9.2 64bit 只知道extern的粗淺概念,有錯糾正 如果a檔案的一個變數前面前置字有extern 那該變數就是在其他檔案有定義,在link階段才 會把extern變數的位址提供給a(是這樣說嗎?),編譯時a只會知道這個變數的名稱跟型態而 已 範例: https://goo.gl/rBdTXw 我把const前置詞先拿掉 先不考慮const的問題 file1.c: unsigned char data1[] = { 0x65, 0xF0, 0xA8, 0x5F, 0x5F, 0x5F, 0x5F, 0x31, 0x32, 0x2E, 0x31, 0xF1, 0x63, 0x4D, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x20, 0x42, 0x59, 0x3A, 0x20, 0x69, 0x73, 0x70, 0x56, }; unsigned int data1_size = sizeof(data1) / sizeof(data1[0]); unsigned int data1_version = 1; main.c: struct Data_Info { unsigned char * data_ptr; unsigned int data_size; unsigned int data_version; }; extern unsigned char data1[]; extern unsigned int data1_size; extern unsigned int data1_version; static struct Data_Info Data_Info_Table[] = { { data1, data1_size, data1_version}, }; int main(void) { return 0; } [Error] initializer element is not constant [Error] (near initialization for 'Data_Info_Table[0].data_size') [Error] (near initialization for 'Data_Info_Table[0].data_version') 下面的回應是說The problem is that the compiler doesn't know the value to place into the data_size and data_version members of the field. ok,但是我不太確定結構的第一個成員指標變數為什麼沒有問題? 是因為它是位址? 在compiler階段會跟編譯器講data1有定義在某處,所以link階段就會得 link到? 是不是跟引用外部function的概念一樣? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.7.85 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1527574537.A.90A.html

05/29 23:55, 6年前 , 1F
基本就跟你講的一樣 compile階段會留一個symbol給data1
05/29 23:55, 1F

05/29 23:56, 6年前 , 2F
link時會把這個symbol填上它在記憶體佈局裡的位置
05/29 23:56, 2F

05/29 23:57, 6年前 , 3F
如果其他.o或lib沒給出這個symbol你的linker會不給過
05/29 23:57, 3F

05/29 23:59, 6年前 , 4F
所以到執行期的時候data1的位置已經"寫死"在elf裡面了
05/29 23:59, 4F

05/30 09:17, 6年前 , 5F
謝謝!
05/30 09:17, 5F
文章代碼(AID): #1R3F09aA (C_and_CPP)