標準三檔案架構
project/
├── main.c // 主程式入口
├── utils.h // 介面宣告 (頭檔)
└── utils.c // 實現定義 (原始檔)
utils.h (介面契約)
#ifndef UTILS_H
#define UTILS_H
// 僅宣告,不定義
int add(int a, int b);
void print_hello(void);
#endif
utils.c (實現)
#include "utils.h"
#include
int add(int a, int b) { return a + b; }
void print_hello(void) { printf("Hello from utils!\n"); }
main.c (使用者)
#include "utils.h"
int main()
{
printf("3 + 5 = %d\n", add(3, 5));
print_hello();
return 0;
}
編譯連結指令
# 方法一:單步編譯連結
gcc main.c utils.c -o app
# 方法二:分離編譯 (大型專案適用)
gcc -c utils.c -o utils.o
gcc -c main.c -o main.o
gcc main.o utils.o -o app
關鍵規則
- 頭檔 **僅含宣告** (函數原型、
extern 變數、型別定義、巨集),**不含定義** (函數體、非 extern 變數定義)。
- 頭檔需 **防重複包含** (
#ifndef / #pragma once)。
- 原始檔
#include "utils.h" 以讓編譯器檢查宣告與定義一致。
- 跨目錄時,編譯器加
-Iinclude_path,連結器加 -Llib_path -lutils。