久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9106|回復: 8
打印 上一主題 下一主題
收起左側

用#ifndef #define #endif寫頭文件的一點總結

[復制鏈接]
跳轉到指定樓層
樓主
ID:68618 發表于 2014-12-6 17:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


      以前寫程序時,頭文件里都用了#ifndef xxx  #define xxx ......  #endif,因為知道這是一種條件編譯,防止重復,在多個.c文件里都可以#include "xxx.h"了,也就這么用了,但是這兩天編寫一個小程序時,照這么寫編譯連接時卻提示重復定義,于是就不知道了,明明已經用條件編譯防止重復了呀。于是在網絡上各種找答案,最后發現了問題所在,再加上自己的一些理解,在這里做個總結,以防以后又忘了。

      #ifndef xxx  #define xxx ......  #endif這個應該是防止重復聲明而不是防止重復定義(可能這么說也不準確)。應該keil編譯器是這樣的,允許多次聲明,只要每次聲明不發生沖突(所謂沖突,舉個例子,比如在一個文件里聲明的函數為void a(void);,而在另一個文件里聲明的卻是void a(int a);,這就是函數原型沖突了。),程序就是能正常編譯連接的,因為聲明只是告訴編譯器一個符號是什么或函數原型是什么,但定義就涉及到存儲空間、地址等等這些了。還有就是他是能在同一個編譯單元中防止重復(我猜想同一個編譯單元就姑且把他認為是同一個.c文件吧,也許不對。),但是在不同的編譯單元之間他是不能傳遞的,只有在最后鏈接輸出可執行文件時再來把編譯生成的每個.o或.obj一起鏈接,在這個過程中可能就會提示重復定義而導致無法鏈接輸出可執行文件了。再來看看我出現的問題,原來我是在頭文件里定義變量了,形如:

#ifndef xxx

#define xxx

unsigned char a[]={..........};  

............

#endif

這樣,在每個.c文件里單獨編譯的時候,能正常編譯出.o文件,但是在鏈接時就會發現多個.o文件中包含相同的symbol a,從而導致無法正常鏈接造成程序不成功。

      解決方法就是對于一般的變量就不要在頭文件里定義,如果是想多個.c文件訪問(分享)同一個變量,那么可以在頭文件里聲明為全局的外部變量,當然關鍵字什么的大家都知道了,我也知道,形如:extern 數據類型 變量名; (不過好像用keil開發51單片機程序時數據類型bit 可以省略不寫,有點忘記了。),然后在某一個.c文件中定義一下該變量就可以了。不過記住,extern是聲明而不是定義,所以在頭文件中千萬不要給他初始化,只有在.c文件中定義時才可初始化。如果你是想在頭文件里寫一個常量大數組給后面的程序用,比如 const unsigned char image[]={......}; ,那你就只能在要用他的那個.c文件里#include "xxxx.h"了,其他地方不能在#include "xxxx.h"了,因為你是在該頭文件里定義變量。我的問題就是這種。


評分

參與人數 1黑幣 +10 收起 理由
yangshijieab + 10 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:70075 發表于 2014-12-7 12:05 | 只看該作者
好。。
回復

使用道具 舉報

板凳
ID:70075 發表于 2014-12-7 12:06 | 只看該作者
支持。
回復

使用道具 舉報

地板
ID:70172 發表于 2014-12-9 10:35 | 只看該作者
好久沒這么細致的研究C了
回復

使用道具 舉報

5#
ID:65179 發表于 2014-12-10 14:40 | 只看該作者
好。。
回復

使用道具 舉報

6#
ID:79544 發表于 2015-11-2 13:07 | 只看該作者
受益匪淺,謝謝!
回復

使用道具 舉報

7#
ID:94481 發表于 2015-11-2 22:01 | 只看該作者
之前一直模模糊糊的,不會用頭文件
回復

使用道具 舉報

8#
ID:76348 發表于 2016-2-6 23:43 | 只看該作者
有所收獲!謝謝!!!
回復

使用道具 舉報

9#
ID:243748 發表于 2017-11-26 12:04 來自手機 | 只看該作者
對程序看不懂,也不會編,感覺好難
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜电影网 | 日韩在线精品视频 | 国产精品69久久久久水密桃 | 国产亚洲成av人在线观看导航 | 91精品国产综合久久久久久丝袜 | 7777精品伊人久久精品影视 | 久久精品国产久精国产 | 精品久久国产 | 久久亚洲欧美日韩精品专区 | 亚洲vs天堂 | 亚洲日韩中文字幕一区 | 久久久涩 | 一级免费a | 国产乱码精品1区2区3区 | 一区二区三 | 国产一区二区三区视频 | 91在线播| 中文字幕1区2区3区 日韩在线视频免费观看 | 亚洲va中文字幕 | 午夜寂寞福利视频 | 波多野吉衣在线播放 | 欧美日韩在线一区二区三区 | 精品久久久久一区二区国产 | 久久骚| 国产一区二区电影 | 精品在线一区 | 亚洲精品日韩欧美 | 日韩久久久久久 | 91精品国产91久久久久久密臀 | 国产日产欧产精品精品推荐蛮挑 | 一级在线免费观看 | 91免费在线播放 | av入口 | 国产欧美精品一区二区 | 国产日韩精品一区 | 伊人精品久久久久77777 | 日韩中文在线视频 | 综合二区 | 国产成人高清 | 人妖无码 | 日韩中文字幕一区二区 |