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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9150|回復: 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 贊一個!

查看全部評分

回復

使用道具 舉報

ID:70075 發表于 2014-12-7 12:05 | 顯示全部樓層
好。。
回復

使用道具 舉報

ID:70075 發表于 2014-12-7 12:06 | 顯示全部樓層
支持。
回復

使用道具 舉報

ID:70172 發表于 2014-12-9 10:35 | 顯示全部樓層
好久沒這么細致的研究C了
回復

使用道具 舉報

ID:65179 發表于 2014-12-10 14:40 | 顯示全部樓層
好。。
回復

使用道具 舉報

ID:79544 發表于 2015-11-2 13:07 | 顯示全部樓層
受益匪淺,謝謝!
回復

使用道具 舉報

ID:94481 發表于 2015-11-2 22:01 | 顯示全部樓層
之前一直模模糊糊的,不會用頭文件
回復

使用道具 舉報

ID:76348 發表于 2016-2-6 23:43 | 顯示全部樓層
有所收獲!謝謝!!!
回復

使用道具 舉報

ID:243748 發表于 2017-11-26 12:04 來自手機 | 顯示全部樓層
對程序看不懂,也不會編,感覺好難
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av高清在线观看 | av大片在线 | 午夜精 | 91中文字幕在线观看 | 亚洲成在线观看 | 91精品国产91久久久久游泳池 | a中文在线视频 | 日韩中文字幕在线视频 | 精品国产乱码久久久久久果冻传媒 | 亚洲福利网站 | 中文字幕在线观看 | 亚洲第1页| 欧美亚洲免费 | 欧美五月婷婷 | 一区二区在线 | 国产一级在线 | 91在线最新| 91成人免费电影 | 久久亚洲一区二区三区四区 | 国产美女精品视频 | 国产一区二区精品在线 | 欧美日韩一区二区三区四区 | 国产成人精品午夜视频免费 | 九色综合网| 精品久久香蕉国产线看观看亚洲 | 精品国产一区二区三区性色 | 午夜在线影院 | 免费看国产精品视频 | 91精品国产综合久久久久 | 午夜免费福利电影 | 欧美三级电影在线播放 | 美女人人操 | 国产在线一区二区三区 | 日韩精品久久一区二区三区 | 资源首页二三区 | 97久久精品午夜一区二区 | 成人免费在线电影 | 天天欧美| 99久久免费观看 | 精品欧美一区二区精品久久久 | 成人水多啪啪片 |