首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言預定義宏實戰:#ifdef __linux__ 判斷編譯平台

     編輯:關於C語言

場景:跨平台代碼中區分 Linux/Windows 編譯分支

預處理階段根據編譯器內置宏自動判斷目標平台,無需手動定義。

驗證代碼


#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 標準宏
_WIN32Windows 32/64 位 (MSVC/MinGW)MSVC 定義,MinGW 也定義
_WIN64Windows 64 位與 _WIN32 同時定義
__APPLE__macOS / iOSApple Clang/GCC
__MACH__Darwin 內核 (macOS/iOS)常與 __APPLE__ 共現
__GNUC__GCC 編譯器版本號見 __GNUC_MINOR__ 等
_MSC_VERMSVC 編譯器版本如 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 代碼的三板斧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved