1. 程式人生 > >C語言程式碼的標頭檔案與原始檔有什麼區別?

C語言程式碼的標頭檔案與原始檔有什麼區別?

標頭檔案和原始檔在本質上沒有任何區別。

字尾為  .h 的檔案是標頭檔案,內含函式宣告巨集定義結構體定義等內容。

字尾為  .c 的檔案是原始檔,內含函式實現變數定義等內容。而且是什麼字尾也沒有關係,只不過編譯器會預設對某些字尾的檔案採取某些動作。這樣分開寫成兩個檔案是一個良好的程式設計風格。

簡單的說其實要理解C檔案與標頭檔案(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:

  ①預處理階段;②詞法與語法分析階段;③ 編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 (.obj檔案);④連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平臺相關的可執行檔案,當然,最後還可以用objcopy生成純二進位制碼,也就是去掉了檔案格式資訊。(生成.exe檔案)

  比方說在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++編譯器都支援一種連結方式被稱為Static Link,即所謂靜態連結。在這種方式下,我們所要做的,就是寫出包含函式,類等等宣告的標頭檔案(a.h,b.h,...),以及他們對應的實現檔案(a.cpp,b.cpp,...),編譯程式會將其編譯為靜態的庫檔案(a.lib,b.lib,...)。在隨後的程式碼重用過程中,我們只需要提供相應的標頭檔案(.h)和相應的庫檔案(.lib),就可以使用過去的程式碼了。

相對動態方式而言,靜態方式的好處是實現程式碼的隱蔽性,即C++中提倡的“介面對外,實現程式碼不可見”。有利於庫檔案的轉發。

相關推薦

C語言程式碼檔案原始檔什麼區別

標頭檔案和原始檔在本質上沒有任何區別。 字尾為  .h 的檔案是標頭檔案,內含函式宣告、巨集定義、結構體定義等內容。 字尾為  .c 的檔案是原始檔,內含函式實現,變數定義等內容。而且是什麼字尾也沒有關係,只不過編譯器會預設對某些字尾的檔

C++ 基礎(三)C++檔案原始檔的使用方法 舉例

看完這篇文章,你就知道怎麼用標頭檔案和原始檔了 http://www.cnblogs.com/fenghuan/p/4794514.html 標頭檔案:常量、變數、函式、類的宣告 原始檔:變數的定義和函式的實現 步驟一、先建立標頭檔案 #ifndef CIRCLE_H #defi

c語言檔案、巨集、指標

#include命令 #include是檔案包含命令,主要用來引入對應的標頭檔案。#include的處理過程很簡單,就是將標頭檔案的內容插入到該命令所在的位置,從而把標頭檔案和當前原始檔連線成一個原始檔,這與複製貼上的效果相同。#include有兩種使用方式: #include <stdio.h&g

C語言字串檔案string.h中的strlen,strcat,strcpy,strncpy,strcmp,strlwr,strupr函式

前言 本博文內容基於VC6.0++, 2.本博文主要介紹包含在string.h中的幾個字串相關的函式; strlen(字串陣列名) 字串有效長度函式; 返回值:整型 功能:用來測量一個字串的有效長度(所謂有效,就是從字串中的第一個字元開始,一

C語言stdio檔案包含內容介紹(常用函式用法簡介)

結構體: FILE    在stdio.h標頭檔案中定義的結構。一般來說,它用於對檔案進行操作的函式的引數或者返回值等等。它在標頭檔案中的定義如下(成員後面的註釋援引自百度知道,準確與否我查詢資料未果,到後來專門找個時間將FILE結構體解讀一下):typedef struc

如何自定義C語言.h檔案

    在專案實踐中,如果一個.c檔案程式過長,可以把檔案中的函式單獨放在一個頭檔案中,然後在.c中包含該標頭檔案即可。這兩天,根據所看的書《C語言的科學與藝術》和網上的資料,發現實際上有兩種寫法。寫法1:在.h標頭檔案中就包含函式的實現,這種標頭檔案實際上是把函式放在一起,

C/C++語言檔案中定義全域性變數

轉載:http://blog.csdn.net/chenqiai0/article/details/8490665 全域性變數可不可以定義在可被多個.C檔案包含的標頭檔案中?為什麼? 可以,在不同的C檔案中以static形式來宣告同名全域性變數。標頭檔案中不可以直接定

VS2015建立一個完整的c++工程:檔案.h 原始檔.cpp,自動生成類

開啟VS2015 ,新建VS win32工程,前面步驟很簡單,不再闡述 下面直接開始: 新建一個VC++ win32的程式, 在原始檔加下新增.cpp檔案,一般放main函式 #include <iostream> #include <locale&

c語言List檔案和應用

util_list.h#ifndef __UTIL_LIST__ #define __UTIL_LIST__ /*雙鏈節點*/ typedef struct list_node { list_node * prev; list_node * next; } LIST

成為C++高手之檔案條件編譯

但現在看起來真不爽,main.c依賴的檔案不能在工程中管理,要修改那些檔案的話麻煩大了。如何既能分成多個檔案又能在工程中看到呢?可以,使用標頭檔案(h檔案)。 標頭檔案中只放那些不產生記憶體佔用的程式碼,比如定義結構(定義結構不會產生記憶體分配,只有用結構

C++中的檔案原始檔:如何寫檔案

通常,在一個C++程式中,只包含兩類檔案——.cpp檔案和.h檔案。其中,.cpp檔案被稱作C++原始檔,裡面放的都是C++的原始碼;而.h檔案則被稱作C++標頭檔案,裡面放的也是C++的原始碼。 C+ +語言支援“分別編譯”(separate compilation)。也就是說,一個程式所有的內容,可以分成

C語言自己建立檔案使用

連結串列作用很大,就以建立連結串列為例分享一下自己學到的東西 1、首先現在vs中建立一個頭檔案(不是建立專案),例如: 建立一個名為CreatelinkAndPrintlink.h的標頭檔案(檔案中內容包括對建立函式和輸出函式的宣告及函式內容): include <stdio.h&

c/c++ _c語言模組_檔案_原始檔_檔案搜尋路徑

標頭檔案 為什麼會有標頭檔案; 怎麼製作標頭檔案; 我們的編譯器是怎麼找到標頭檔案; 模組:有組織有結構的來給程式碼劃分模組,處理同一個功能程式碼,我們放到一個模組裡面,.c檔案 假設我們新增一個數學函式原始檔,並且新增到編輯器

C語言中,檔案原始檔的關係(轉)

//a.h void foo(); //a.c #include "a.h"   //我的問題出來了:這句話是要,還是不要? void foo() {      return; } //main.c #include "a.h" int main(int argc

gsoap+URL自動生成檔案客戶端程式碼流程

1、下載gsoap程式碼下載連結     下載以後解壓,進入\gsoap-2.8\gsoap-2.8\gsoap\bin\win32這個目錄下面有兩個執行檔案soapcpp2.exe 與wsdl2h.exe     wsdl2h.exe這個是生成標頭檔案的     so

C++檔案檔案結構

標頭檔案 在將一個程式分解成若干個檔案時,需要考慮識別符號在其他檔案中的可見性。使用標頭檔案是一個很有效的方法。如: # include<iostream.h> 其中的iostream.h是系統定義的一個檔案,這種以“.h”命名的檔案稱為“標頭檔案”。系統定義

C語言中,檔案的作用,檔案原始檔的關係(轉)

簡單的說其實要理解C檔案與標頭檔案(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段  2.詞法與語法分析階段  3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 (.obj檔案) 4.連線階段,將各個目標檔

C++檔案原始檔的關係以及makefile檔案

背景 因為函式之間需要相互引用,寫入一個檔案顯得雜亂。寫入不同檔案,引用和編譯也很麻煩。故用標頭檔案。 規則 標頭檔案的格式: #ifndef <標頭檔案的名稱> #define <標頭檔案的名稱> <定義的函式&g

C++中為什麼要檔案原始檔分開寫呢?

對c&c++程式來說,基本上來說都是要把原始檔和標頭檔案分別編寫。一般都是代表一個基本功能的原始檔引用相應的標頭檔案。 一個 相關功能的模組可能有若干對原始檔和標頭檔案組成。這是基於元件程式設計的核心。 在我看來,他的好處是巨大的,是java不可比擬的,也是

檔案同名原始檔的關係

一、標頭檔案尋找路徑   1,系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢。   #include <xxx.h>   2,使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢,然後在到C++安裝目錄(比如VC中可以指定和修