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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9262|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人亚洲网 | 日韩欧美国产电影 | 国产欧美一区二区在线观看 | av黄色片 | 久久精品免费观看 | 国产精品日产欧美久久久久 | 国内精品视频在线 | 欧美久久久久久久久中文字幕 | 精品国产色 | 国产精品精品久久久 | 亚洲一区二区视频在线观看 | 天天综合久久 | 视频一区二区三区中文字幕 | 欧美精品综合在线 | 国产激情一区二区三区 | 国产精品一区在线观看你懂的 | 欧美在线观看一区二区 | 狠狠插天天干 | www.久久 | 欧美午夜一区二区三区免费大片 | 久久精品亚洲国产奇米99 | 亚洲精品久久久久久久久久久久久 | 欧美一区二区免费视频 | 国产一级片免费在线观看 | 午夜影院在线观看 | 欧美午夜精品久久久久久浪潮 | 自拍偷拍中文字幕 | 色欧美片视频在线观看 | 国产99久久精品一区二区300 | 91精品久久久久久久 | 一区二区三区视频在线 | 国产精品国产精品国产专区不卡 | 久久人人国产 | 久久国产精品91 | 精品粉嫩超白一线天av | av一级| 在线看片福利 | 久久久久久久综合色一本 | 欧美综合一区 | 成人免费观看男女羞羞视频 | 午夜手机在线视频 |