日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

h文件和c文件的关系是什么

發布時間:2023/12/15 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 h文件和c文件的关系是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本教程操作環境:windows7系統、C++17版本、Dell G3電腦。

詳解C語言項目中.h文件和.c文件的關系

在編譯器只認識.c(.cpp))文件,而不知道.h是何物的年代,那時的人們寫了很多的.c(.cpp)文件,漸漸地,人們發現在很多.c(.cpp)文件中的聲明語句就是相同的,但他們卻不得不一個字一個字地重復地將這些內容敲入每個.c(.cpp)文件。但更為恐怖的是,當其中一個聲明有變更時,就需要檢查所有的.c(.cpp)文件。

于是人們將重復的部分提取出來,放在一個新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX這樣的語句。這樣即使某個聲明發生了變更,也再不需要到處尋找與修改了。因為這個新文件,經常被放在.c(.cpp)文件的頭部,所以就給它起名叫做“頭文件”,擴展名是.h。

在我們語言的初學階段,往往我們的程序只有一個.c的文件或這很少的幾個,這時我們就很少遇到頭文件組織這個頭疼的問題,隨著我們程序的增加,代碼 量到了幾千行甚至幾萬行,文件數也越來越多。這時這些文件的組織就成了一個問題,其實說白了這些文件的組織問題從理論上來說是軟件工程中的模塊設計等等的問題。

頭文件的作用的簡短描述:

(1)通過頭文件來調用庫功能。在很多場合,源代碼不便(或不準)向用戶公布,只要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎么實現的。編譯器會從庫中提取相應的代碼。

(2)頭文件能加強類型安全檢查。如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程序員調試、改錯的負擔。

比方說 我在aaa.h里定義了一個函數的聲明,然后我在aaa.h的同一個目錄下建立aaa.c , aaa.c里定義了這個函數的實現,然后是在main函數所在.c文件里#include這個aaa.h 然后我就可以使用這個函數了。 main在運行時就會找到這個定義了這個函數的aaa.c文件。這是因為:main函數為標準C/C++的程序入口,編譯器會先找到該函數所在的文件。

假定編譯程序編譯myproj.c(其中含main())時,發現它include了mylib.h(其中聲明了函數void test()),那么此時編譯器將按照事先設定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實現文件(擴展名為.cpp或.c,此例中為mylib.c),如果找到該文件,并在其中找到該函數(此例中為void test())的實現代碼,則繼續編譯。

如果在指定目錄找不到實現文件,或者在該文件及后續的各include文件中未找到實現代碼,則返回一個編譯錯誤.其實include的過程完全可以“看成”是一個文件拼接的過程,將聲明和實現分別寫在頭文件及C文件中,或者將二者同時寫在頭文件中,理論上沒有本質的區別。

理論上來說C文件與頭文件里的內容,只要是C語言所支持的,無論寫什么都可以的,比如你在頭文件中寫函數體,只要在任何一個C文件包含此頭文件就可以將這個函數編譯成目標文件的一部分(編譯是以C文件為單位的,如果不在任何C文件中包含此頭文件的話,這段代碼就形同虛設),你可以在C文件中進行函數聲明,變量聲明,結構體聲明,這也不成問題!!!那為何一定要分成頭文件與C文件呢?又為何一般都在頭件中進行函數,變量聲明,宏聲明,結構體聲明呢?而在C文件中去進行變量定義,函數實現呢??

要理解C文件與頭文件有什么不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:

1.預處理階段

2.詞法與語法分析階段

3.編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各個目標文件

4.連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平臺相關的可執行文件,編譯器在編譯時是以C文件為單位進行的,也就是說如果你的項目中一個C文件都沒有,那么你的項目將無法編譯,連接器是以目標文件為單位,它將一個或多個目標文件進行函數與變量的重定位,生成最終的可執行文件,在PC上的程序開發,一般都有一個main函數,這是各個編譯器的約定。為了生成一個最終的可執行文件,就需要一些目標文件,也就是需要C文件,而這些C文件中又需要一個main函數作為可執行程序的入口。

簡單些說就是C語言的編譯分為預處理、編譯、匯編、鏈接(test.c test.h => test.i => test.s => test.o => test)四個大的階段。c文件中的#include宏處理,會在預處理的階段將c中引用的h文件的內容全部寫到c文件中,最后生成.i中間文件,這時h 文件中的內容就相當于被寫道c文件中。

這也為代碼的復用提供了渠道,很多的c文件可以去引用同一個h文件,這樣這個h文件就會被放到多個c文件中被編譯多 次,這也是h文件中不能放定義只能放聲明的原因,放定義時被編譯多次,在程序鏈接的時候(系統中定義了多個int a;強符號定義)會出現錯誤, 聲明就不一樣,聲明表示對定義的擴展,最終都會終結到一個定義上,所以不會出現link時重復定義的錯誤。

編程中我們在h文件中肯定都用過一下的格式

#ifndef  XXX_H
#define  XXX_H
 //……
#endif

登錄后復制

呵呵,那他到底有什么用呢,在h文件互相引用時,消除重復定義。當然宏定義是在預處理階段發揮作用的,編譯方后的過程是沒有宏的影子的。

A.h
int a();
  
B.h
#include "A.h"
  
C.h
#include "A.h"
  
D.h
#include "A.h"
#include "B.h"

登錄后復制

上面的D.h文件中就會重復出現兩個int a();的聲明阿,這樣就有點重復了,這時條件編譯宏就派上了用場

A.h
#ifndef A_H
#define A_H
int a();
#endif

登錄后復制

這樣就不會重復定義了。

推薦教程:《C#》

以上就是h文件和c文件的關系是什么的詳細內容,更多請關注風君子博客其它相關文章!

總結

以上是生活随笔為你收集整理的h文件和c文件的关系是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天摸夜夜爽 | 男生和女生操操 | 欧洲一区二区 | 思思99精品视频在线观看 | 91视频在线网站 | 综合婷婷久久 | 中文久久乱码一区二区 | 芒果视频污污 | 好色成人网 | 啊av在线| 张津瑜国内精品www在线 | 一本黄色片 | 亚洲男人的天堂网 | 热热色国产 | 欧美一级全黄 | 欧美激情一区二区三区四区 | 免费看黄色片网站 | 日韩精品视频免费看 | 久久精品人妻一区二区三区 | 99精品欧美一区二区 | 樱桃国产成人精品视频 | 久操国产在线 | 国产乱子一区二区 | 无限资源日本好片 | 91成品人影院| 天天摸天天干天天操 | 色网站免费在线观看 | 青青啪啪| 原创少妇半推半就88av | av在线免费不卡 | 天天综合在线视频 | 婷婷激情五月综合 | 天天插夜夜 | 狠狠鲁狠狠干 | 影音先锋三级 | 国产精品海角社区 | 性久久久久久久久 | 亚洲黄色片子 | 日本丰满少妇裸体自慰 | 能直接看的av网站 | 女儿朋友 | 亚洲欧美日韩一区二区三区四区 | 成人动漫一区二区 | 国产视频一区二区在线 | 国产精品午夜在线观看 | 欧美黄色录像 | 自拍偷拍第二页 | 国产一区综合 | 人人九九精 | 国产喷水视频 | julia一区| 插女生下面 | 91久久综合精品国产丝袜蜜芽 | 天躁夜夜躁狼狠躁 | 亚洲骚图| 日本欧美国产在线 | 日本成人黄色片 | 久草精品国产 | 宅男在线视频 | 天天操天天操天天操天天操天天操 | 成人免费视频视频 | 国产精品久久久久野外 | 午夜欧美视频 | 免费黄色小视频在线观看 | 青青青在线视频观看 | 亚洲国产果冻传媒av在线观看 | 人人澡人人草 | 久久精品韩国 | 无码少妇一区二区 | 激情高潮呻吟抽搐喷水 | 精品久久二区 | 一区二区三区日韩在线 | 久久亚洲影视 | 善良的女邻居在线观看 | 性一级视频 | 亚洲一级一区 | 99精品视频在线观看免费 | 久久久久久久久久久91 | 色婷婷aⅴ一区二区三区 | 欧美.com| 国产主播在线看 | 日韩一级一区 | 成人做受视频试看60秒 | 献给魔王伊伏洛基亚吧动漫在线观看 | 三级视频网 | 亚洲AV无码成人国产精品色 | 精品国产乱子伦 | 好吊操精品视频 | 欧美寡妇性猛交ⅹxxx | 久久综合在线 | 一本色道久久hezyo加勒比 | 一区二区免费在线播放 | 理论片琪琪午夜电影 | 森林影视官网在线观看 | 欧美一级黄色片 | 欧美男女啪啪 | 日韩性xxx | 日韩视频中文 | 亚洲一区二区三区无码久久 |