預處理階段根據編譯器內置宏自動判斷目標平台,無需手動定義。
#include <stdio.h>
#include <stdlib.h>
int main() {
#ifdef __linux__
printf("linux test success!\n");
exit(0);
#endif
printf("linux test failure!\n");
return 0;
}
linux test success!
| 宏名稱 | 標識平台/編譯器 | 備註 |
|---|---|---|
__linux__ | Linux (GCC/Clang) | GNU C 標準宏 |
_WIN32 | Windows 32/64 位 (MSVC/MinGW) | MSVC 定義,MinGW 也定義 |
_WIN64 | Windows 64 位 | 與 _WIN32 同時定義 |
__APPLE__ | macOS / iOS | Apple Clang/GCC |
__MACH__ | Darwin 內核 (macOS/iOS) | 常與 __APPLE__ 共現 |
__GNUC__ | GCC 編譯器 | 版本號見 __GNUC_MINOR__ 等 |
_MSC_VER | MSVC 編譯器版本 | 如 1930 表 VS2022 |
__clang__ | Clang 編譯器 | 版本號見 __clang_major__ 等 |
// platform.h
#if defined(_WIN32) || defined(_WIN64)
#define PLATFORM_WINDOWS 1
#define PLATFORM_LINUX 0
#define PLATFORM_MAC 0
#elif defined(__linux__)
#define PLATFORM_WINDOWS 0
#define PLATFORM_LINUX 1
#define PLATFORM_MAC 0
#elif defined(__APPLE__) && defined(__MACH__)
#define PLATFORM_WINDOWS 0
#define PLATFORM_LINUX 0
#define PLATFORM_MAC 1
#else
#error "Unsupported platform"
#endif
// 統一 API 封裝
#if PLATFORM_WINDOWS
#include
#define SLEEP(ms) Sleep(ms)
#define PATH_SEP '\\'
#elif PLATFORM_LINUX || PLATFORM_MAC
#include
#define SLEEP(ms) usleep((ms)*1000)
#define PATH_SEP '/'
#endif
現代 CMake/Autotools 推薦檢測功能而非平台:
// CMakeLists.txt
check_function_exists(pthread_create HAVE_PTHREAD)
check_include_file(sys/epoll.h HAVE_EPOLL)
check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME)
// config.h 生成後
#if HAVE_PTHREAD
#include
#endif
#if HAVE_EPOLL
// 使用 epoll 高性能 I/O
#endif
優勢:代碼自動適配新平台(如 FreeBSD、Android、嵌入式 RTOS),無需維護平台宏列表。
#ifdef __linux__ 是預處理器根據編譯器內置宏自動判斷的**編譯期常量分支**,零運行開銷。掌握主流平台宏、建立統一平台抽象層、向特性檢測遷移,是寫出可移植 C 代碼的三板斧。