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

C/C++ 頭文件防重複包含:#pragma once vs #ifndef 守衛宏深度對比

     編輯:關於C語言

兩大主流方案

特性#pragma once#ifndef GUARD
機制編譯器識別物理文件預處理器宏狀態檢查
可移植性主流編譯器均支持(MSVC、GCC、Clang)C/C++ 標準,全平台通用
同名不同文件視為不同文件,會重複包含宏名衝突則誤以為已包含
符號鏈接/拷貝同一文件多路徑引用可能失效宏名唯一則安全
編譯速度略快(無需展開宏)極微差異,可忽略

標準守衛宏模板

#ifndef PROJECT_MODULE_FILENAME_H
#define PROJECT_MODULE_FILENAME_H

/* 头文件内容 */

#endif // PROJECT_MODULE_FILENAME_H

命名規範:項目_模塊_文件名_H,全大寫,杜絕衝突。

工程選型建議

  1. 跨平台/開源項目:堅持 #ifndef 守衛,零風險
  2. 內部/單編譯器項目:#pragma once 更簡潔,無需維護宏名
  3. 雙重保險:兩者同時使用,互不干擾:
#pragma once
#ifndef PROJECT_MODULE_FILENAME_H
#define PROJECT_MODULE_FILENAME_H
...
#endif

常見錯誤避坑

  • 宏名與系統頭文件衝突(如 _STDIO_H)
  • 忘記 #endif 導致後續文件被誤屏蔽
  • 複製頭文件未修改宏名,造成「明明存在卻找不到聲明」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved