
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策機制
- C語言 - 決策機制
- C語言 - if語句
- C語言 - if...else語句
- C語言 - 巢狀if語句
- C語言 - switch語句
- C語言 - 巢狀switch語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while迴圈
- C語言 - for迴圈
- C語言 - do...while迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break語句
- C語言 - continue語句
- C語言 - goto語句
- C語言中的函式
- C語言 - 函式
- C語言 - main函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 可變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O (檔案處理)
- C預處理器
- C語言 - 預處理器
- C語言 - 編譯指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
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並建立一個新的控制檯應用程式:

為專案選擇一個合適的名稱。在資料夾中新增一個新的空檔案,並將以下程式碼儲存為“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 選項來定義。