




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
以下是如何定義全局變量。眾所周知,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過C語言中extern關(guān)鍵字調(diào)用的變量。因此,必須在 .C 和 .H 文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯(cuò)誤。Errore46: Undefined external SerBfr referred in ZLG522S D:mcu430prjzlg522sDebugObjZLG522S.r43 )以下討論的方法只需用在頭文件中定義一次。雖然有點(diǎn)不易懂,但用戶一旦掌握,使用起來卻很靈活。表1.2中的定義出現(xiàn)在定義所有全局變量的.H頭文件中。程序清單 L 1.2 定義全局宏。#ifdef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#endif.H 文件中每個(gè)全局變量都加上了xxx_EXT的前綴。xxx代表模塊的名字。該模塊的.C文件中有以下定義:#define xxx_GLOBALS#include includes.h當(dāng)編譯器處理.C文件時(shí),它強(qiáng)制xxx_EXT(在相應(yīng).H文件中可以找到)為空,(因?yàn)閤xx_GLOBALS已經(jīng)定義)。所以編譯器給每個(gè)全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C文件時(shí),xxx_GLOBAL沒有定義,xxx_EXT被定義為extern,這樣用戶就可以調(diào)用外部全局變量。為了說明這個(gè)概念,可以參見uC/OS_II.H,其中包括以下定義:#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_EXT INT32U OSIdleCtr;OS_EXT INT32U OSIdleCtrRun;OS_EXT INT32U OSIdleCtrMax;同時(shí),uCOS_II.H有中以下定義:#define OS_GLOBALS#include “includes.h”當(dāng)編譯器處理uCOS_II.C時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT被設(shè)置為空。INT32U OSIdleCtr;INT32U OSIdleCtrRun;INT32U OSIdleCtrMax;這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒有定義,所以O(shè)S_EXT被定義為extern。extern INT32U OSIdleCtr;extern INT32U OSIdleCtrRun;extern INT32U OSIdleCtrMax;在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。【網(wǎng)友經(jīng)驗(yàn)(來自CSDN)】:盡管一個(gè)全局變量或函數(shù)可以(在多個(gè)編譯單元中) 有多處“聲明”, 但是“定義” 卻只能允許出現(xiàn)一次。定義是分配空間并賦初值(如果有) 的聲明。最好的安排是在某個(gè)相關(guān)的.c 文件中定義, 然后在頭文件(.h) 中進(jìn)行外部聲明, 在需要使用的時(shí)候, 只要包含對(duì)應(yīng)的頭文件即可。定義變量的.c 文件也應(yīng)該包含該頭文件, 以便編譯器檢查定義和聲明的一致性。 這條規(guī)則提供了高度的可移植性: 它和ANSI C標(biāo)準(zhǔn)一致, 同時(shí)也兼容大多數(shù)ANSI 前的編譯器和連接器。Unix 編譯器和連接器通常使用“通用模式”允許多重定義, 只要保證最多對(duì)一處進(jìn)行初始化就可以了; ANSI C 標(biāo)準(zhǔn)稱這種行為為“公共擴(kuò)展”, 沒有語帶雙關(guān)的意思。 如果希望讓編譯器檢查聲明的一致性, 一定要把全局聲明放到頭文件中。特別是, 永遠(yuǎn)不要把外部函數(shù)的原型放到.c 文件中: 通常它與定義的一致性不能得到檢查, 而矛盾的原型比不用還糟糕。如何定義宏、取消宏 /定義宏 #define MacroName MacroValue /取消宏 #undef MacroName 普通宏 #define PI (3.1415926) 帶參數(shù)的宏 #define max(a,b) (a) (b)? (a),(b) 關(guān)鍵是十分容易產(chǎn)生錯(cuò)誤,包括機(jī)器和人理解上的差異等等。所以如果用的話,建議所有的層次都要加括號(hào)。 條件編譯 #ifdef XXX(#else) #endif 例如 #ifdef DV22_AUX_INPUT #define AUX_MODE 3 #else #define AUY_MODE 3 endif #ifndef XXX (#else) #endif 頭文件(.h)可以被頭文件或C文件包含; 重復(fù)包含(重復(fù)定義) 由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個(gè)頭文件,就可能出現(xiàn)重復(fù)定義的問題的。 通過條件編譯開關(guān)來避免重復(fù)包含(重復(fù)定義) 例如 #ifndef _headerfileXXX_ define _headerfileXXX_ 文件內(nèi)容 #endif#define的一些用法 karla 發(fā)表于 2005-3-28 16:36:00 1.簡(jiǎn)單的define定義 #define MAX 1000 一個(gè)簡(jiǎn)單的max就定義好了,它代表1000,如果在程序里面寫 for(i=0;i . 編譯器在處理這個(gè)代碼之前會(huì)對(duì)MAX進(jìn)行處理替換為1000。 2.define的“函數(shù)定義” define可以像函數(shù)那樣接受一些參數(shù),如下 #define max(x,y) (x) (y)?(x):(y); 這個(gè)定義就將返回兩個(gè)數(shù)中較大的那個(gè),看到了嗎?因?yàn)檫@個(gè)“函數(shù)”沒有類型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,它絕對(duì)沒有模板那么安全就是了。可以作為一個(gè)簡(jiǎn)單的模板來使用而已。 但是這樣做的話存在隱患,例子如下: #define Add(a,b) a+b; 在一般使用的時(shí)候是沒有問題的,但是如果遇到如:c * Add(a,b) * d的時(shí)候就會(huì)出現(xiàn)問題,代數(shù)式的本意是a+b然后去和c,d相乘,但是因?yàn)槭褂昧薲efine(它只是一個(gè)簡(jiǎn)單的替換),所以式子實(shí)際上變成了 c*a + b*d 另外舉一個(gè)例子: #define pin (int*); pin a,b; 本意是a和b都是int型指針,但是實(shí)際上變成int* a,b; a是int型指針,而b是int型變量。 這是應(yīng)該使用typedef來代替define,這樣a和b就都是int型指針了。 3.宏的單行定義 #define A(x) T_#x #define B(x) #x #define C(x) #x 我們假設(shè):x=1,則有: A(1)-T_1 B(1)- 1 C(1)- 1 (這里參考了 hustli的文章) 3.define的多行定義 define可以替代多行的代碼,例如MFC中的宏定義(非常的經(jīng)典,雖然讓人看了惡心) #define MACRO(arg1, arg2) do /* declarations */ stmt1; stmt2; /* . */ while(0) /* (no trailing ; ) */ 關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè) 侃單片機(jī) 主題:請(qǐng)教如何申明枚舉類型為全局變量刷新 我要回復(fù) 我要發(fā)帖 此貼已結(jié)(20) 22 回復(fù) / 2724 查看 返回列表12下一頁 發(fā)短消息 加為好友 chshfeng84 當(dāng)前在線 帖子77 精華0 積分503 閱讀權(quán)限20 在線時(shí)間279 小時(shí) 注冊(cè)時(shí)間2009-1-20 最后登錄2012-8-17 帖子: 77積分: 503專家等級(jí): 結(jié)貼率100%chshfeng84發(fā)表于 2010-12-15 09:52 | 只看該作者 回復(fù) 引用 訂閱 報(bào)告 收藏 分享 評(píng)分打印樓主: 請(qǐng)教如何申明枚舉類型為全局變量變量, 請(qǐng)教, 枚舉, 類型, 全局2個(gè).c文件都需要用到該枚舉變量,所以希望在頭文件中申明該枚舉變量。比如申明一個(gè)枚舉變量 enum a,b,c,cc。我在頭文件中申明 extern enum a,b,c,cc; 然后在一個(gè).c文件中初始化cc=a; 但是這樣keil編譯時(shí)會(huì)出現(xiàn)cc 重定義這樣的警告。不知道大家是如何申明枚舉變量為全局變量的?謝謝大家分享本文到: 模塊電源常見故障分析免費(fèi)下載!廣州金升陽科技有限公司LED驅(qū)動(dòng)器訣竅和技巧網(wǎng)上資源下載 吉時(shí)利最新技術(shù)資料下載在線觀看泰克最新測(cè)試設(shè)備介紹 來TI在線培訓(xùn)抽大獎(jiǎng),ipad只是二等獎(jiǎng)哦! 發(fā)短消息 加為好友 HWM 當(dāng)前離線 帖子8794 精華25 積分30906 閱讀權(quán)限70 在線時(shí)間1662 小時(shí) 注冊(cè)時(shí)間2001-1-1 最后登錄2012-8-16 帖子: 8794積分: 30906專家等級(jí): HWM發(fā)表于 2010-12-15 10:39 | 只看該作者 回復(fù) 引用 評(píng)分 報(bào)告 返回版面 TOP 得分:202樓: re LZ:變量別放在頭文件里。由于頭文件可能被多模快引用,就可能出現(xiàn)重復(fù)定義。作為全局變量,在一個(gè)??熘卸x一次,而在其他模快中用“extern”說明之。按LZ情形,應(yīng)該出現(xiàn)的是“未定義”的錯(cuò)誤,因?yàn)椤癳xtern”不提供實(shí)質(zhì)意義上的變量物理空間的分配。解決的方法是:頭文件中放置enum abc a,b,c;C文件中放置enum abc cc; / 在某一主模塊中extern enum abc cc; / 在其他模塊中這樣,就可以對(duì)cc進(jìn)行操作了,如:cc = c; 發(fā)短消息 加為好友 chshfeng84 當(dāng)前在線 帖子77 精華0 積分503 閱讀權(quán)限20 在線時(shí)間279 小時(shí) 注冊(cè)時(shí)間2009-1-20 最后登錄2012-8-17 帖子: 77積分: 503專家等級(jí): chshfeng84發(fā)表于 2010-12-15 11:52 |
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)療美容行業(yè)美容護(hù)膚成分分析與應(yīng)用監(jiān)管策略研究報(bào)告
- 2025年醫(yī)療健康行業(yè):醫(yī)療健康行業(yè)創(chuàng)新技術(shù)應(yīng)用與市場(chǎng)潛力研究
- 腫瘤中醫(yī)養(yǎng)生調(diào)理課件
- 臨床護(hù)理帶教心得體會(huì)
- 腫瘤病人護(hù)理病例討論
- 培訓(xùn)版權(quán)課件
- 腫瘤基因檢測(cè)初學(xué)入門
- 工裝車培訓(xùn)課件
- HTML5移動(dòng)開發(fā)培訓(xùn)
- 社區(qū)護(hù)理學(xué):以家庭為中心
- 2023-2024學(xué)年全國(guó)初中七年級(jí)下語文人教版期末考試試卷(含答案解析)
- 有趣的圖形化編程
- T-CECS120-2021套接緊定式鋼導(dǎo)管施工及驗(yàn)收規(guī)程
- PPH術(shù)后護(hù)理查房
- 2022年江蘇省常州市強(qiáng)基計(jì)劃選拔數(shù)學(xué)試卷(附答案解析)
- 小學(xué)生體適能教育現(xiàn)狀調(diào)查與分析
- HG∕T 5229-2017 熱空氣老化箱
- 09SMS202-1埋地矩形雨水管道及附屬構(gòu)筑物(混凝土模塊砌體)
- 醫(yī)生簽約MCN機(jī)構(gòu)合同模版
- 重慶市沙坪壩區(qū)南開中學(xué)校2023-2024學(xué)年八年級(jí)下學(xué)期期末英語試題(無答案)
- 廣東省深圳市南山區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末英語試題
評(píng)論
0/150
提交評(píng)論