|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
C語言中變量的聲明和定義的關(guān)系 |
| 作者:平常人 欄目:單片機 |
在英文里有兩個詞涉及這個問題:declare 和 define,在中文中這兩個詞都可以翻成“定義”,但在C語言中他們有不同的意義;讓我們稱declare=聲明,define=定義。 “聲明(declare)”是用于定義一個變量的類型;“定義(define)”是用于定義一個變量所占用的存儲;顯然,一個變量的類型可以定義多次,只要他們不互相矛盾即可;而一個變量的存儲只能定義一次,否則程序如何用一個變量名訪問多于一個的存儲空間呢? 每次引用一個變量時,引用變量的語句行之前必須出現(xiàn)該變量的聲明,該聲明可以是直接出現(xiàn)在這個語句行所在的源文件中,或出現(xiàn)在一個頭文件中,該源文件用include包含這個頭文件。 一個項目中可以有多個源文件,但在所有的源文件中只允許出現(xiàn)一次對某個變量的定義。 這里借用“新手園地”中小羅納耳朵的一個問題作為例子: 我用Keil寫程序時,子程序里需要用到定義一個數(shù)組 array[]={0x01,0x02} 放在main函數(shù)里定義會提示array未定義! 但是如果放在頭文件config.h里面定義為: extern code unsigned CHAR array[]={0x01,0x02}; 結(jié)果編譯時出現(xiàn) MULTIPLE PUBLIC DEFINITIONS定義。但是我的頭文件里面已經(jīng)用預處理命令了 #ifndef __CONFIG_H__ #define __CONFIG_H__ 頭文件的內(nèi)容 #endif 為什么還會出現(xiàn)這種重復定義的錯誤? 他的錯誤是,下面這行是定義array的存儲,而他又把這行放到了頭文件config.h中,等于是在多個源文件中重復地定義array的存儲: extern code unsigned CHAR array[]={0x01,0x02}; 正確的做法是在頭文件中用這樣的聲明語句(必須加extern,否則變成定義存儲了): extern code unsigned CHAR array[]; // 聲明array是一個外部變量 然后在某個源文件中加入這樣的語句(此處不必加extern): code unsigned CHAR array[] = {0x01, 0x02}; // 定義array的存儲 |
| 2樓: | >>參與討論 |
| 作者: 平常人 于 2006/10/26 0:17:00 發(fā)布:
奇怪,經(jīng)常有人問相關(guān)的問題,或犯這類錯誤,此帖卻無人關(guān)注 可能我說的太清楚了,沒人有任何疑問了,哈哈,太好了! 自己頂一下。 |
|
| 3樓: | >>參與討論 |
| 作者: mochaowu03 于 2006/10/26 9:38:00 發(fā)布:
"="號不可隨便用 "="號不可隨便用哦,頂你一下 |
|
| 4樓: | >>參與討論 |
| 作者: jt4117 于 2006/10/26 12:19:00 發(fā)布:
頂 |
|
| 5樓: | >>參與討論 |
| 作者: guet 于 2006/10/26 13:09:00 發(fā)布:
這是變量的存儲問題 假如有兩個文件file1.c,file2.c 在file1.c中定義了一個變量 int var ; 如果在file2.c中也想用這個變量,只需將var聲明為外部變量既可 extern int var //是聲明不是定義 如果我只想讓var變量只能用于本文件,其它文件不能使用它,那么在定義var的時候聲明為靜態(tài)局部變量,既在file1.c中定義為 static int var |
|
| 6樓: | >>參與討論 |
| 作者: huangqi412 于 2006/10/26 14:24:00 發(fā)布:
學習 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |