C++程序中添加.c.h的實(shí)現(xiàn)方法
C++程序中添加.c.h的方法
方法一
1、把要添加的.c和.h文件復(fù)制到c++程序目錄中。
2、把.c文件改為.cpp文件
3、把.c.h文件都添加到該項(xiàng)目中 就可以使用了
方法二
1、項(xiàng)目配置不使用預(yù)編譯頭
2、.c文件加載到程序需中
3、把c語言函數(shù)的聲明用extern "C"{};中。
現(xiàn)在最好的寫法是:
?//test.h? ?#ifdef __cplusplus? ?extern "C" {? ?#endif? ?//c語言函數(shù)聲明寫在這? ?#ifdef __cplusplus? ?}? ?#endif? ? //test.c? ? //.c開頭出? ?#ifdef __cplusplus? ?extern "C" {? ?#endif? ?#include "test.h"? ?//.c文件內(nèi)容? ?#ifdef __cplusplus? ?}? ?#endif? ?//.c文件結(jié)束?
C/C++中的.h和.c文件
編譯器的工作過程
涉及到的函數(shù)、結(jié)構(gòu)體、變量等比較多。通常,編寫c/c++項(xiàng)目的方式是,有一個(gè)main.c文件,該文件的main函數(shù)作為接口,調(diào)用其他函數(shù)。所有其他函數(shù)按功能,分別放在不同的.h文件中,這樣的方式在編譯和運(yùn)行上肯定是沒有什么問題的。
隨著項(xiàng)目編寫的深入,結(jié)構(gòu)、邏輯以及變量的日趨復(fù)雜,總感覺上述方式的實(shí)現(xiàn)仍然不夠清晰并且會(huì)導(dǎo)致一些冗余。忽然記起,在課堂上,老師提到過,.h文件一般用來存放函數(shù)聲明和變量名,那么為什么我在.h文件中實(shí)現(xiàn)函數(shù)不會(huì)有問題呢?其他.c文件和main.c文件又有什么關(guān)系呢?這些,都使我不得不重新思考.h文件和.c文件的作用和關(guān)系。
.h文件的由來和弊端
要理清.h文件的作用,我們不妨看看.h文件的由來:
“在編譯器只認(rèn)識.c(.cpp))文件,而不知道.h是何物的年代,那時(shí)的人們寫了很多的.c(.cpp)文件,漸漸地,人們發(fā)現(xiàn)在很多.c(.cpp)文件中的聲明語句就是相同的,但他們卻不得不一個(gè)字一個(gè)字地重復(fù)地將這些內(nèi)容敲入每個(gè).c(.cpp)文件。但更為恐怖的是,當(dāng)其中一個(gè)聲明有變更時(shí),就需要檢查所有的.c(.cpp)文件。
于是人們將重復(fù)的部分提取出來,放在一個(gè)新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX這樣的語句。這樣即使某個(gè)聲明發(fā)生了變更,也再不需要到處尋找與修改了。因?yàn)檫@個(gè)新文件,經(jīng)常被放在.c(.cpp)文件的頭部,所以就給它起名叫做“頭文件”,擴(kuò)展名是.h。
在我們語言的初學(xué)階段,往往我們的程序只有一個(gè).c的文件或這很少的幾個(gè),這時(shí)我們就很少遇到頭文件組織這個(gè)頭疼的問題,隨著我們程序的增加,代碼 量到了幾千行甚至幾萬行,文件數(shù)也越來越多。這時(shí)這些文件的組織就成了一個(gè)問題,其實(shí)說白了這些文件的組織問題從理論上來說是軟件工程中的模塊設(shè)計(jì)等等的問題。”(引自c語言項(xiàng)目中.h文件和.c文件的關(guān)系)
由上可以看出,.h文件最初就是用來給變量和函數(shù)提供一些全局性的聲明,這些聲明被其他.c文件共享,方便變量和聲明的修改,使得大型代碼邏輯更清晰更易于維護(hù)。因此.h文件中一般是聲明,很少有代碼的具體實(shí)現(xiàn)。
h文件在編譯原理
那么為什么在.h文件中實(shí)現(xiàn)函數(shù)也不會(huì)出錯(cuò)呢?在.h文件中實(shí)現(xiàn)函數(shù)與在.c文件中實(shí)現(xiàn)函數(shù)有什么區(qū)別和聯(lián)系呢?普通的.C文件和包含main函數(shù)的c文件有什么區(qū)別和聯(lián)系呢?
要解決上述問題,首先必須弄清編譯器的工作原理。編譯器的最終目的是將程序員編寫的源代碼轉(zhuǎn)換成機(jī)器能夠識別運(yùn)行的二進(jìn)制機(jī)器碼。
大體上分,可以分為4個(gè)步驟:
1.頭文件的預(yù)編譯,預(yù)處理
- 編譯器在編譯源代碼時(shí),會(huì)先編譯頭文件,保證每個(gè)頭文件只被編譯一次。
- 在預(yù)處理階段,編譯器將c文件中引用的頭文件中的內(nèi)容全部寫到c文件中。
2.詞法和語法分析(查錯(cuò))
3.編譯(匯編代碼,.obj文件)
- 轉(zhuǎn)化為匯編碼,這種文件稱為目標(biāo)文件。后綴為.obj。
4.鏈接(二進(jìn)制機(jī)器碼,.exe文件)
- 將匯編代碼轉(zhuǎn)換為機(jī)器碼,生成可執(zhí)行文件。
- 更詳細(xì)具體的流程可參考編譯器的工作過程
- 在編譯過程中,.h文件中的所有內(nèi)容會(huì)被寫到包含它的.c文件中,而所有的.c文件以一個(gè)共同的main函數(shù)作為可執(zhí)行程序的入口。
- 因此,在.h文件中編寫函數(shù)實(shí)現(xiàn)并不會(huì)出錯(cuò),相當(dāng)于所有.h的內(nèi)容最后都被寫到了main.c文件中。
- 但是為了邏輯性、易于維護(hù)性以及一些其他目的(可參考c語言中.h文件和.c文件的解析),一般在.h文件中寫函數(shù)的聲明,在.c文件中編寫函數(shù)的實(shí)現(xiàn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
好用的C++ string Format“函數(shù)”介紹
大家好,本篇文章主要講的是好用的C++ string Format“函數(shù)”介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C++中與輸入相關(guān)的istream類成員函數(shù)簡介
這篇文章主要介紹了C++中與輸入相關(guān)的istream類成員函數(shù)簡介,包括eof函數(shù)和peek函數(shù)以及putback函數(shù)還有ignore函數(shù),需要的朋友可以參考下2015-09-09C++實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找
這篇文章主要介紹了C++實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下2014-09-09C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請求,需要的朋友可以參考下2023-11-11