在一個項目下的多個c文件可以關聯使用比如:
- main.c文件:
#include<stdio.h>
int max(a,b);
int main()
{
int a=5;
int b=6;
printf("%d\n",max(a,b);
}
- max.c文件:
double max(double a,double b)
{
return a+b;
}
在運行時兩個文件都不會編譯錯誤,但會運行錯誤,因爲其變量類型聲明是不同的。
解決問題的方法是把max函數原型放到頭文件(.h)中,在需要max是去引用他:
- max.h文件:
int max(int a,int b);
並在main.c及,max.c中引用max.h:
#include "max.h"
再次運行,編譯器可以發現max.c中的類型錯誤,編譯器能知道max的原型是什麼。max.h內的代碼插入到include行進行編譯。
- 自己寫的頭文件以雙引號include,編譯時會先從當前目錄找該頭文件,然後從系統找,尖括號直接從系統找
其實stiod.h等頭文件中並沒有函數的源代碼,而只有該函數的原型。
- 好的編程習慣是,把除了main.c的.c文件都寫一個對應的.h聲明其原型,全局變量的聲明也寫入.h,可以在多個.c文件間共享,比如:
//max.c文件下
int gAll=12;
...
//max.h文件下
extern int gAll;
//main.c下
int main()
{
a=1;
max(a,gAll);
return 0;
}
- 如果在函數前加static,那麼該函數只能在這個.c文件中使用
- 定義和聲明不同,聲明無具體代碼內容(比如宏聲明,函數原型,結構聲明等),而定義(函數定義,變量)有。
- 只有聲明可以放在頭文件中
- 同一編譯單元不要有同名聲明,爲了避免頭文件重複定義,則一般寫作標準頭文件格式:
#ifndef _MAX_H_
#define _MAX_H_
double max(double a, double b);
extern in gAll
#endif