我們在使用c編程的時候經常會遇到頭文件,前段時間我自己做了個小項目的時候,也遇到了關於頭文件的問題。
預處理器發現#include 指令后,就會尋找后跟的文件名並把這個文件包含的內容包含到當前文件中。被包含文件的文本將替換源文件中的#include 指令,就像您把被包含文件中的全部內容鍵入到源文件的特定位置一樣(摘抄自 cprimer plus)。簡單來說就是,編譯器把 #include 后跟隨的文件內容都寫到源文件中,寫的位置就是 #include放的位置。
#include指令有兩種形式
1:#include<stdio.h> 文件名放在尖括號里面
在unix系統中,尖括號告訴預處理器在一個活多個標准的目錄中尋找文件。如果做開發,比如,我使用keil和mdk,編譯器也遵循這樣的原則,放在默認目錄中,不用人工處理。
2:#include”mystuff.h” 文件名放在雙引號中
有兩種形式:
<1>:#include”hot.h”收索當前的工作目錄
<2>:#include”/usr/biff/p.h”收索/usr/biff所在的目錄
對於unix系統,使用雙引號意味着先搜索本地目錄,但是具體收索那個牡蠣依賴於編譯器。有些編譯器收索源代碼所在的目錄,還有些收索工程文件所在的目錄。
對於我使用的mdk,我是將文件所在的文件夾添加到工程能夠搜索的目錄中。
在寫c程序的時候,我們經常會把函數寫在一個.c文件中,然后在另外的.c文件中引用函數,使得整個程序更加整潔,方便。
但是在頭文件使用的時候經常出現重定義的錯誤,我使用的解決辦法是:
首先把hello.c拆分為兩個文件hello.c和hello.h。hello.h中包含hello.c所需要的頭文件和.c中出現的函數名。例如在hello.c中有
void add (int x,int y)
{
z=x+y;
return y;
}
就在hello.h中添加 void add(int x,int y);和hello.c所需的頭文件#include<stdio.h>
在拆分后的hello.c添加#include”hello.h”,然后把hello.c和hello.h放在同一個文件夾即可。當有文件需要add函數時直接在頭文件中添加#include”hello.h”即可。
當多個文件引用hello.h時候,例如當plus.c中引用hello.c,jump.c需要使用plus.c和add.c。就會出現重定義的錯誤(引用hello.c和plus是z指將hello.h和plus.h頭文件添加到jump.c中)
這時候就引用防重定義。假設要放重引用hello.h 在開頭添加
#ifndef __HELLO_H__
#define __HELLO_H__
結尾添加
#endif
既把你要重定義的文件的開頭添加
#ifndef __HELLO_H__
#define __HELLO_H__
HELLO就是你文件的名字改成大寫 H就是你文件類型
再在結尾加上
#endif
即可。