C語言標頭檔案



`#include` 預處理指令 用於將一個檔案(通常稱為標頭檔案)中函式、常量和宏等的定義提供給另一個 C 程式碼使用。標頭檔案副檔名為“.h”,您可以從中包含一個或多個預定義函式、常量、宏等的宣告。C語言中提供標頭檔案有助於程式的模組化設計。

系統標頭檔案

C編譯器軟體包含許多預編譯的標頭檔案。這些稱為系統標頭檔案。“stdio.h”就是一個眾所周知的例子——幾乎每個C程式都會包含的標頭檔案。

每個系統標頭檔案都包含許多實用函式。這些函式通常稱為庫函式。例如,用於執行I/O操作的printf()和scanf()函式就是“stdio.h”標頭檔案中提供的庫函式。

載入一個或多個頭檔案的預處理器語句總是在C程式碼的開頭。我們從學習C程式設計的基本“Hello World”程式開始,它首先包含“stdio.h”檔案

#include <stdio.h>

int main() {

   /* my first program in C */
   printf("Hello, World! \n");

   return 0;
}

C預處理指令`#include`基本上是向編譯器發出請求,載入特定標頭檔案的內容,以便在程式中使用它們。

C或C++程式中通常的做法是,我們將所有常量、宏、系統範圍的全域性變數和函式原型放在標頭檔案中,並在需要的地方包含該標頭檔案。

在C語言中包含標頭檔案的語法

標頭檔案是用`#include` 指令載入的。它的用法遵循以下兩種方法之一:

#include <filename.h>

如果標頭檔案在系統/預設目錄中可用,則將其名稱放在尖括號內。

#include "filename.h"   

對於在與原始檔相同的目錄中可用的使用者定義或非標準標頭檔案,將其名稱放在雙引號內。

`#include`指令的工作原理是指示C預處理器在繼續處理當前原始檔的其餘部分之前,先掃描指定的檔案作為輸入。預處理器的輸出包含已生成的輸出,後跟包含檔案生成的輸出,最後是`#include`指令之後文字生成的輸出。

C語言中的標準標頭檔案

一個典型的C編譯器包含許多預編譯的標頭檔案。每個標頭檔案都包含一組預定義的標準庫函式。“#include”預處理指令用於在程式中包含副檔名為“.h”的標頭檔案。

下表顯示了一些C語言標頭檔案:

標頭檔案 描述 函式/宏/變數
stdio.h 輸入/輸出函式 scanf(), printf(), fopen(), FILE
stdlib.h 通用實用函式 atoi(), atof(), malloc()
math.h 數學函式 sin(), cos(), pow(), sqrt()
string.h 字串函式 strcpy(), strlen(), strcat()
ctype.h 字元處理函式 isalpha(), isupper(), ispunct()
time.h 日期和時間函式 asctime(), gmtime(), mktime()
float.h 浮點型別的限制 FLT_ROUNDS, FLT_RADIX,
limits.h 基本型別的尺寸 CHAR_BIT, CHAR_MIN, CHAR_MAX
wctype.h 確定寬字元資料中包含的型別的函式。 iswalpha(), iswctype(),iswupper()

示例

以下程式碼使用了來自一些標頭檔案的幾個庫函式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main() {

   char s1[20] = "53875";
   char s2[10] = "Hello";
   char s3[10] = "World";

   int res;
   res = pow(8, 4);
   printf("Using math.h, The value is : %d\n", res);

   long int a = atol(s1);
   printf("Using stdlib.h, the string to long int: %d\n", a);

   strcpy(s2, s3);
   printf("Using string.h, the strings s2 and s3: %s\t%s\n", s2, s3);

   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Using math.h, The value is: 4096
Using stdlib.h, the string to long int: 53875
Using string.h, the strings s2 and s3: World	World

使用者自定義標頭檔案

我們可以在C程式中新增一個或多個使用者自定義函式(除了main()函式)。但是,如果程式碼包含大量函式定義,將它們放在一個副檔名為“.c”的單個原始碼檔案中將難以處理和維護。因此,將性質相似的函式/宏/變數組合在一起放在標頭檔案中,就像包含標準標頭檔案一樣包含它們,並呼叫其中定義的函式。

使用者定義的標頭檔案通常放在包含C原始碼的同一目錄中。

下面介紹了使用CodeBlocks IDE建立和使用標頭檔案的步驟。啟動CodeBlocks IDE並建立一個新的控制檯應用程式:

Header Files

為專案選擇一個合適的名稱。在資料夾中新增一個新的空檔案,並將以下程式碼儲存為“myheader.h”

#ifndef MYHEADER_H
#define MYHEADER_H

void sayHello();
int add(int a, int b);
double area(double radius);
int length(char *x);

#endif

如果一個頭檔案恰好被包含兩次,編譯器將處理其內容兩次,這將導致錯誤。防止這種情況的標準方法是使用`#ifndef`指令將檔案的全部實際內容括在條件定義中,這稱為標頭檔案保護

標頭檔案保護檢查標頭檔案是否已定義。如果未定義,則意味著該檔案是第一次被包含,並且將處理保護內的程式碼。

標頭檔案包含要包含的函式的宣告或原型。這些函式的實際定義在一個“.c”檔案中提供,其名稱與標頭檔案相同。

建立標頭檔案

將以下程式碼儲存到“myheader.c”檔案中:

#include <stdio.h>
#include <string.h>
#include <math.h>

#define PI 3.142

void sayHello(){
   printf("Hello World\n");
}

int add(int a, int b){
   int result;
   result = a+b;
   return result;
}

double area(double radius){
   double areaofcircle = PI*pow(radius, 2);
   return areaofcircle;
}

int length(char *x){
   return strlen(x);
}

使用標頭檔案

現在,我們可以在程式中包含“myheader.h”檔案並呼叫上述任何函式。將以下程式碼儲存為專案資料夾中的“main.c”。

#include <stdio.h>
#include "myheader.h"

int main() {

   int p = 10, q = 20;
   double x = 5.25;

   sayHello();
   printf("sum of %d and %d is %d\n", p, q, add(p,q));
   printf("Radius: %lf Area: %lf", x, area(x));

   return 0;
}

構建專案並執行“main.c”,可以透過CodeBlocks IDE的執行選單或命令列獲得以下結果:

Hello World
sum of 10 and 20 is 30
Radius: 5.250000 Area: 86.601375

計算包含

有時需要選擇要包含到程式中的幾個不同的標頭檔案之一。例如,它們可能指定要在不同型別的作業系統上使用的配置引數。您可以使用一系列條件語句來做到這一點:

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

但是,隨著它的增長,它變得很繁瑣,預處理器提供了使用宏作為標頭檔案名稱的功能。這稱為計算包含。不必將標頭檔案名稱作為`#include`的直接引數寫入,只需在那裡放置一個宏名稱即可:

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_H 將會被擴充套件,預處理器會尋找 system_1.h,就像 #include 指令原本就是那樣編寫的一樣。SYSTEM_H 可以透過 Makefile 的 -D 選項來定義。

廣告