#include將指定文件內容原樣插入到 #include 所在行,形成單一編譯單元。實現模塊化、聲明複用、配置隔離。
| 語法 | 搜尋順序 | 典型用途 |
|---|---|---|
#include <stdio.h> | 系統包含目錄(-I 指定、環境變量、編譯器內建) | 標準庫、系統頭文件、第三方庫 |
#include "myheader.h" | 1. 當前源文件目錄 2. 系統包含目錄 | 項目內部頭文件、本地配置 |
#include 只能包含一個文件,多文件需多條指令。#include "../common/config.h"。// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
// 聲明內容
void foo(void);
#endif
或現代 #pragma once(非標準但主流編譯器均支持)。
根據編譯期條件選擇性編譯代碼片段,生成不同目標文件。用於:跨平台適配、功能裁剪、調試開關、版本區分。
#ifdef / #else / #endif
#ifdef MACRO_NAME
// MACRO_NAME 已定義(無論值)編譯此段
#else
// 未定義編譯此段
#endif
// 無 else 簡寫
#ifdef DEBUG
printf("Debug: %d\n", x);
#endif
#ifndef / #else / #endif
#ifndef MACRO_NAME
// 未定義編譯此段
#else
// 已定義編譯此段
#endif
常用於護衛宏:#ifndef HEADER_H。
#if / #elif / #else / #endif(常量表達式)
#define VERSION 2
#if VERSION == 1
void func_v1(void);
#elif VERSION == 2
void func_v2(void);
#else
#error "Unsupported version"
#endif
defined(MACRO) 運算符)。defined(MACRO) 返回 1/0,可用於複雜條件:#if defined(OS_LINUX) && defined(ARCH_X86_64)。if| 維度 | 條件編譯 | 運行時 if |
|---|---|---|
| 決策時機 | 編譯期 | 運行期 |
| 目標代碼 | 僅包含選中分支 | 包含所有分支 |
| 體積 | 更小 | 較大 |
| 靈活性 | 需重新編譯切換 | 運行時動態切換 |
| 適用場景 | 平台差異、功能裁剪、調試代碼 | 業務邏輯分支 |
// platform.h
#ifdef _WIN32
#include
#define SLEEP_MS(ms) Sleep(ms)
#elif defined(__linux__) || defined(__APPLE__)
#include
#define SLEEP_MS(ms) usleep((ms)*1000)
#else
#error "Unsupported platform"
#endif
// 使用
SLEEP_MS(1000); // 編譯期展開為平台特定調用
# 字符串化:#define STR(x) #x → STR(abc) 展開 "abc"。## 連接:#define CONCAT(a,b) a##b → CONCAT(var,1) 展開 var1。#@ 字符化(GNU 擴展):#define CHAR(c) #@c → CHAR(a) 展開 'a'。#include 實現聲明共享與模塊化,善用雙引號/尖括號區分路徑,務必加護衛宏。#ifdef、#ifndef、#if,核心是編譯期決策、死代碼消除。# ## 能構建強大的元編程模板(如自動生成枚舉字符串、註冊表)。