C/C++ 頭文件命名約定

有的時候,在C++的代碼中,可以看到有如下的頭文件引用的代碼:

#include <iostream>
#include <unistd.h>
#include <csignal>

其中有一些是引用了.h文件,另外一些是引用了模塊式的比如iostreamcsignal,那么為什么會出現這樣的情況呢,以及這兩種頭文件的包含形式之間有什么關系和區別呢?


1. C++ 標準庫的命名規則

1.1 C 標準庫的 C++ 版本
  • C++ 標準庫為了兼容 C,將 C 標準庫頭文件重新命名,遵循以下規則:

    • 去掉 .h 后綴
      例如,C 的 <signal.h> 在 C++ 中變為 <csignal>
    • 添加前綴 c
      前綴 c 表示這是 C 標準庫的 C++ 版本。
  • 目的
    將 C 標準庫的內容封裝到 std 命名空間中,避免與 C++ 代碼的命名沖突。

1.2 原生 C 頭文件的保留
  • 如果你直接使用 C 的頭文件(如 <signal.h>),其中的符號(如 SIGINT)會保留在 全局命名空間
  • 如果使用 C++ 封裝版本(如 <csignal>),符號會位于 std 命名空間中(例如 std::raise)。
    注意:實際上,某些編譯器可能仍會將符號放在全局命名空間中,這是歷史遺留問題。

2. 示例對比

C 風格包含(全局命名空間)
#include <signal.h>  // C 頭文件(全局命名空間)int main() {signal(SIGINT, handler); // 直接使用全局符號raise(SIGABRT);return 0;
}
C++ 風格包含(std 命名空間)
#include <csignal>   // C++ 封裝的 C 頭文件int main() {std::signal(SIGINT, handler); // 符號可能位于 std 命名空間std::raise(SIGABRT);return 0;
}

3. 為什么 unistd.h 保留 .h 后綴?

  • unistd.h 不是 C 標準庫的一部分
    它是 POSIX 標準定義的頭文件,用于 Unix-like 系統(如 Linux、macOS)的 API(如文件操作、進程控制)。

    • POSIX 頭文件通常保留 .h 后綴,因為它們屬于操作系統提供的擴展,而非 C/C++ 標準庫。
    • 例如:<sys/types.h>, <pthread.h> 等。
  • C++ 不封裝非標準的 C 頭文件
    只有 C 標準庫的頭文件(如 <stdio.h><math.h>)會被 C++ 封裝為 <cstdio><cmath>,而 POSIX 或其他擴展頭文件保持原樣。


4. 關鍵區別總結

頭文件類型示例命名規則命名空間
C 標準庫頭文件<signal.h>.h 后綴全局命名空間
C++ 封裝的 C 頭文件<csignal>c 前綴 + 無后綴std 命名空間(理論上)
POSIX/系統擴展頭文件<unistd.h>.h 后綴全局命名空間
C++ 原生頭文件<iostream>無后綴std 命名空間

5. 為什么有些編譯器允許混用?

  • 歷史兼容性
    許多編譯器(如 GCC、Clang)為了兼容舊的 C 代碼,允許直接包含 C 風格頭文件(如 <signal.h>),并將其符號同時導入全局命名空間和 std 命名空間。
  • 非強制規范
    C++ 標準未嚴格要求必須使用 <csignal>,但推薦使用后者以明確命名空間。

6. 最佳實踐

  1. 優先使用 C++ 封裝的 C 頭文件(如 <csignal>):
    明確使用 std:: 命名空間,避免污染全局命名空間。
  2. 系統相關頭文件保持原樣(如 <unistd.h>):
    它們不屬于 C++ 標準,按原格式包含。
  3. 避免混用兩種風格
    例如不要同時包含 <csignal><signal.h>,可能導致重復定義。

7. 代碼示例:規范寫法

#include <csignal>    // C++ 封裝的 C 標準庫頭文件
#include <unistd.h>   // POSIX 系統頭文件(保留 .h 后綴)
#include <iostream>   // C++ 原生頭文件void handler(int sig) {std::cout << "Signal: " << sig << std::endl;
}int main() {std::signal(SIGINT, handler); // 使用 std:: 命名空間sleep(1);                     // POSIX 函數(全局命名空間)return 0;
}

總結

  • <csignal> 是 C++ 對 C 標準庫 <signal.h> 的封裝,遵循 c 前綴 + 無后綴的命名規則。
  • .h 后綴的頭文件(如 <unistd.h>)通常是系統或擴展庫的頭文件,不屬于 C++ 標準庫。
  • 這種設計旨在區分 C/C++ 標準庫、系統庫和第三方庫,增強代碼的可讀性和可移植性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94329.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異質結3.0時代的降本提效革命:捷造科技設備技術創新與產業拐點分析

光伏產業經歷了從PERC到TOPCon和異質結&#xff08;HJT&#xff09;的技術迭代&#xff0c;而2025年將成為異質結技術規模化應用的關鍵轉折點。捷造科技通過一系列突破性技術創新&#xff0c;將GW級異質結整線設備價格降至2億元&#xff0c;較行業平均水平降低約40%&#xff0c…

【網絡】http 協議中 Vary 標頭的作用

在 HTTP 協議中&#xff0c;Vary 標頭是一個關鍵的緩存控制機制&#xff0c;用于告知緩存服務器&#xff08;或代理&#xff09;&#xff1a;響應內容的生成依賴于請求中的哪些特定頭部字段。其核心作用是確保緩存服務器能根據這些字段的差異&#xff0c;正確區分和返回不同版本…

CSS 進階用法

一、選擇器進階復雜選擇器組合詳解后代選擇器后代選擇器使用空格分隔兩個選擇器&#xff0c;例如div p&#xff0c;表示選擇div元素內所有的p元素。這種選擇方式會匹配所有層級的后代元素&#xff0c;包括子元素、孫元素等任意深度的嵌套元素。應用示例&#xff1a;/* 選中arti…

GitHub 熱榜項目 - 日榜(2025-08-23)

GitHub 熱榜項目 - 日榜(2025-08-23) 生成于&#xff1a;2025-08-23 統計摘要 共發現熱門項目&#xff1a;13 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術熱點&#xff1a;1&#xff09;AI工作流構建成為風口&#xff0c;sim和airi等項目展示…

SHAP分析+KOA-RIME開普勒結合霜冰算法雙重優化BP神經網絡+9種映射方法+新數據預測!機器學習可解釋分析!

代碼主要功能 該Matlab代碼實現了一個KOA-RIME開普勒結合霜冰算法雙重優化的BP神經網絡回歸模型&#xff0c;結合特征貢獻度分析&#xff08;SHAP&#xff09;和新數據預測功能。核心功能包括&#xff1a; 雙重參數優化&#xff1a;先用智能算法&#xff08;以chebyshev映射改進…

【數據結構】棧和隊列——棧

目錄棧和隊列棧棧的基本概念棧的順序存儲實現棧的定義與初始化入棧操作出棧操作讀取棧頂元素判空和判滿操作棧的銷毀操作操作集合棧和隊列 棧 棧的基本概念 棧的定義&#xff1a; 棧&#xff08;Stack&#xff09; 是一種線性表&#xff0c;它限定了數據元素的插入和刪除操…

大數據管理與應用系列叢書《數據挖掘》讀書筆記之集成學習(1)

文章目錄前言一、集成學習是什么&#xff1f;1.基本思想2.集成學習的類型3. 集成學習的結合策略3.1 為什么結合策略是集成學習的靈魂&#xff1f;3.2 經典策略(1)**投票法&#xff08;Voting&#xff09;****(2)平均法&#xff08;Averaging&#xff09;****(3) 學習法**3.3 關…

嵌入式知識篇---32GUI

要理解 32 位單片機的 GUI&#xff0c;咱們先從 “基礎概念” 入手&#xff0c;再拆成 “為什么能跑 GUI”“核心組成”“怎么實現”“常用工具”“實際用途” 這幾步講&#xff0c;全程不用復雜術語&#xff0c;像聊日常用品一樣說清楚。一、先搞懂 2 個基礎概念在講 “32 位單…

【iOS】SDWebImage第三方庫源碼學習筆記

前言之前在寫項目時&#xff0c;經常用到SDWebImage這個第三方庫來加載圖片&#xff0c;并且了解到了這個第三方庫在處理圖片時自帶異步下載和緩存功能&#xff0c;以及對cell復用的處理。這篇文章來系統學習一下SDWebImage第三方庫的知識以及底層原理簡介SDWebImage為UIImageV…

Linux --網絡基礎概念

一.網絡發展獨立模式&#xff1a;在早期計算機之間是相互獨立的&#xff0c;機器之間的數據只能通過軟硬盤來傳輸&#xff0c;這就代表無法同時完成任務&#xff0c;需要前面的計算機完成各自的任務經過硬盤傳遞數據再完成自己的任務&#xff0c;效率十分低下。網絡互聯&#x…

教育系統搭建攻略:線上知識付費與線下消課排課全解析

作為一名資深平臺測評師&#xff0c;最近我挖到了一個教育機構的 “寶藏工具”—— 喬拓云教育系統。別看它名字低調&#xff0c;用起來那叫一個順手&#xff0c;線上知識付費、線下消課排課全給你安排得明明白白&#xff0c;簡直是機構老板和教務員的 “摸魚神器”。多端口管理…

PMP項目管理知識點-①項目基本概念

目錄 1.項?的定義 概念&#xff1a; 特點&#xff1a; 項?與運營的區別 項?特點&#xff1a; 運營特點&#xff1a; 2.項?管理的發展 3.項?、項?集與項?組合 結構層次 4.項?的關鍵組成部分 項??命周期&#xff1a; 項?管理過程組&#xff1a; 項?階段&…

Python內置函數全解析:30個核心函數語法、案例與最佳實踐指南

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

數據建模怎么做?一文講清數據建模全流程

目錄 一、需求分析 1. 搞清楚業務目標&#xff1a;這數據是要解決啥問題&#xff1f; 2. 明確數據邊界&#xff1a;哪些數據該要&#xff0c;哪些不該要&#xff1f; 3. 弄明白使用場景&#xff1a;誰用這數據&#xff0c;怎么用&#xff1f; 二、模型設計 1. 第一步&…

胸部X光片數據集:健康及肺炎2類,14k+圖像

胸部X光片數據集概述 數據集包含14090張圖像,分為正常胸部X光3901張,肺炎胸部X光10189張。 標注格式:無標注,文件夾分類。 圖像尺寸:640*640 正常胸部X光: 肺炎胸部X光: 數據采集: 拍攝方式:均為前后位(anterior-posterior)胸部X光,屬患者常規臨床護理的一部分…

MySQL數據庫開發教學(二) 核心概念、重要指令

書接上回&#xff1a;MySQL數據庫開發教學(一) 基本架構-CSDN博客 建議工具&#xff1a; Navicat Premium (收費 / 需破解)&#xff1a;Navicat Premium | 管理和開發你的數據庫 phpstudy 2018 (免費)&#xff1a;phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 前言 …

【40頁PPT】數字工廠一體化運營管控平臺解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91716541 資料解讀&#xff1a;【40頁PPT】數字工廠一體化運營管控平臺解決方案 詳細資料請看本解讀文章的最后內容。該資料圍繞數字工廠一體…

數據產品(2)用戶畫像數據分析模型

目錄 1 用戶畫像 2 RFM模型 (用戶價值分群模型) 3 PSM 價格敏感度 4 精細化運營 1 用戶畫像 也稱用戶表標簽,是基于用戶行為分析獲得的對用戶的一種認知表達,即用戶數據標簽化,通過收集與分析用戶的用戶屬性(年齡、性別、城市、職業、設備、狀態)、用戶偏好(購物偏好,聽…

03_數據結構

第3課&#xff1a;數據結構 課程目標 掌握Python的基本數據結構&#xff1a;列表、元組、字典、集合學習字符串的高級操作方法理解不同數據結構的特點和適用場景 1. 列表&#xff08;List&#xff09; 1.1 列表的創建和基本操作 # 創建列表 fruits ["蘋果", "香…

【JavaEE】多線程 -- CAS機制(比較并交換)

目錄CAS是什么CAS的應用實現原子類實現自旋鎖ABA問題ABA問題概述ABA問題引起的BUG解決方案CAS是什么 CAS (compare and swap) 比較并交換&#xff0c;CAS 是物理層次支持程序的原子操作。說起原子性&#xff0c;這就設計到線程安全問題&#xff0c;在代碼的層面為了解決多線程…