A. C語言定義一個頭文件的格式和引用它的方法
擴展名為.h的文件,在C語言中被稱為header file, 也就是頭文件。
頭文件的數據格式就是普通的文本文件,可以通過新建文本文件(txt),再把擴展名改為.h的方式創建,在此不贅述。
一、頭文件內容格式。
頭文件內容並沒有固定的格式要求,不過一般為防止嵌套引用給編譯器帶來死鎖或者沒必要的開銷,一般約定整個頭文件中所有內容在一個條件編譯下,即如下格式:
#ifndef 宏名
#define 宏名
//頭文件主體
#endif
這樣可以保證一個頭文件在一個源文件中最多隻被引用一次。為避免宏名重復,宏名一般由頭文件名轉換而來,如果頭文件名是xxx.h,那麼宏名一般定義為:
_XXX_H_
即前後各加一個下劃線,同時文件名中除數字、字母、下劃線以外的字元均轉換為下劃線(_)。
頭文件主體中內容同樣沒有做強制約定,可以出現在源文件(.c)中的任何代碼均可以放在頭文件中。不過一般情況下可以包括以下幾種內容:
1 引用其它頭文件,格式為
#include <xxx.h>
或
#include "xxx.h"
二者區別在介紹頭文件引用時再詳細介紹。
2 定義私有類型。比如
typedef unsigned long U32; //為了簡寫而給無符號32位整型定義一個新的名字
struct xxx {};
也可以是enum, union等復雜類型。
3 宏定義。比如
#define MAX(a,b) (a>b?a:b)
4 函數聲明。比如
void test_function(void);
5 全局變數聲明。比如
extern int global_var;
6 如果有一個靜態全局變數需要在不同源文件中使用,但各文件之間互不相關。那麼可以放在頭文件中。如:
static int gs_var = 3;
7 對於支持C99規范的C編譯器,還可以把內聯函數定義在頭文件中。比如
staticinlineintget_min(inta,intb)
{
if(a>b)returnb;
returna;
}
以上是常見的頭文件中的元素。但實際上頭文件中也可以放全局變數的定義,全局函數的實現等。但是頭文件中一旦定義了這樣的元素,這個頭文件在一個工程中只能被一個文件引用,否則編譯器會報重復定義的錯誤。
比如如果有一個規模很大的常量數組,比如一副圖片的二進制值,如果把它定義在源文件中,就會顯得很冗餘,因為並不會經常修改。 這時可以定義在頭文件中,只在一個源文件中引用,當有多幅圖片需要隨時更換時,也可以通過簡單的在源文件中修改引用的頭文件名達到修改的目的。
二、頭文件的引用。
頭文件引用的方法其實之前已經大致說過了,在源文件中引用頭文件和在頭文件中引用的格式是一樣的:
#include<xxx.h>或者
#include "xxx.h"
xxx為頭文件名。
用<>和""是有一定的區別的。在編譯器查找頭文件的時候,會在兩個區域分別查找。
一個是系統頭文件區域,即類似於stdio.h一類的C庫函數頭文件區。
另一個是自定義頭文件區,比如當前目錄,以及其它自定義的目錄。
用<>時,編譯器會先在系統區域查找,然後再查找自定義區域。而用""時則相反。
由於一般並不推薦自定義頭文件名與系統頭文件名相同(容易引起歧義並難以維護),所以先後順序並不是太重要,尤其在硬體速度越來越快的今天,使用哪種符號引用頭文件已經差別很小了。
B. c語言在頭文件中如何引用另一個頭文件中的函數
1、首先建頭文件是為了聲明c文件中的函數,以及包括宏定義。建立頭文專件要有對應的c文件。屬
C. c語言中如何定義,添加頭文件
C語言頭文來件常用格式如自下:
#ifndefLABEL
#defineLABEL
//代碼部分
#endif
其中,LABEL 為一個唯一的標號,命名規則跟變數的命名規則一樣。常根據它所在的頭文件名來命名。
舉例如下:
//頭文件hardware.h
#ifndef__HARDWARE_H__
#define__HARDWARE_H__
#include<stdio.h>
intadd2(inta,intb)//計算兩個變數的和
{
returna+b;
}
#endif
//test.c文件
#include"hardware.h"//將自定義的頭文件包含進源文件中
voidmain()
{
printf("%d",add2(4,6));//調用頭文件中定義的函數
}
D. C語言和匯編怎樣引用對方定義的變數
C中要使用匯編裡面函數的話 需要在匯編裡面使用export xxx 導出函數標號 C中加extern xxx匯編要使用C裡面的函數的話 需要在匯編里使用import xxx 導入外部標號
E. c語言 頭文件
#include 的本質就是把對應的文件直接拷貝到這一行裡面
要理解頭文件,主要是要理解「聲明」
C/C++中,所有使用到得變數、函數、類都要是聲明過得,就是說,要有一行語句來告訴編譯器,我有一個名字叫XXX的???類型的變數(函數、類)。
然後還有一個因素就是,在編譯的時候,程序是按照每個.C或.CPP文件單獨編譯的。
也就是說,對於每個C文件中,如果都用到了同一個函數(比如printf),那麼,我在每個對應文件中寫一遍printf的聲明明顯是很麻煩的。所以我把這個聲明單獨寫了一個文件,為了區別,我把擴展名記做.h,在需要使用對應的函數(類)的時候,我就不需要去拷貝函數的聲明,而只需要#include對應頭文件就可以了,系統自動幫你拷貝進來——C語言提供的頭文件,按照函數功能分類好了,比如數學函數就都寫在了math.h裡面,一包含就全包含,不管你用沒用到cos()這個函數或者其他什麼。
當然,由於.h文件中也可以包含其他.h文件,所以為了不重復聲明或定義,需要用宏做相應的處理,這個不是要理解的東西,而是照著寫。
看到你的補充,在這里我也補充下答案
對於自己定義的函數,首先,肯定的是,你至少需要在一個C文件中定義它,否則鏈接會出錯。當你想在任何一個文件中使用的時候,你只需要讓這個文件包函數聲明所在的頭文件即可。
具體來說:
a.h中聲明了了
int a( int x);
a.c中實現這個函數,需要有類似代碼
#include "a.h"
//.....其他代碼
int a(int x)
{
return x*x;
}
如果在b.c中想使用這個,則只要在b.c中這樣就可以:
#include "a.h"
//....其他代碼
x = a(x);
//...其他代碼