C/C++---預定義常量

在C/C++開發中,預定義常量是編譯器與標準庫提供的“隱形工具集”,無需開發者顯式定義,卻在跨平臺兼容、調試定位、數值計算安全等場景中發揮核心作用。這些常量涵蓋編譯環境標識、語言標準判斷、代碼定位信息、數值邊界限制等多個維度,掌握預定義常量能顯著提升代碼的健壯性與可維護性。

一、數值類型邊界常量:計算安全的基礎

數值邊界常量定義于標準頭文件中,描述基本數據類型的取值范圍,是防止溢出、確保計算準確性的關鍵工具。

1.1 整數類型邊界(<limits.h>)

<limits.h>定義了所有基本整數類型的最值,適用于charshortintlong等類型,其值隨平臺位數(32/64位)可能變化:

常量名稱對應類型作用說明32位環境典型值64位環境典型值
INT_MINint有符號int最小值-2147483648-2147483648
INT_MAXint有符號int最大值21474836472147483647
UINT_MAXunsigned int無符號int最大值42949672954294967295
LONG_MINlong有符號long最小值-2147483648-9223372036854775808
LONG_MAXlong有符號long最大值21474836479223372036854775807
ULONG_MAXunsigned long無符號long最大值429496729518446744073709551615
CHAR_MINchar有符號char最小值(依賴編譯器)-128-128
CHAR_MAXchar有符號char最大值(依賴編譯器)127127
SHRT_MIN/SHRT_MAXshort短整數最值-32768/32767-32768/32767

1.2 固定寬度整數邊界(<stdint.h>,C99+)

C99引入的<stdint.h>解決了不同平臺上int/long寬度不一致的問題,定義了固定寬度整數類型(如int32_t),其邊界常量值與平臺無關:

常量名稱對應類型作用說明固定值(跨平臺一致)
INT8_MIN/INT8_MAXint8_t8位有符號整數最值-128/127
UINT8_MAXuint8_t8位無符號整數最大值255
INT32_MIN/INT32_MAXint32_t32位有符號整數最值-2147483648/2147483647
UINT32_MAXuint32_t32位無符號整數最大值4294967295
INT64_MIN/INT64_MAXint64_t64位有符號整數最值-9223372036854775808/9223372036854775807

1.3 浮點類型邊界(<float.h>)

<float.h>定義了浮點數的精度與范圍,對科學計算至關重要,遵循IEEE 754標準的典型值如下:

常量名稱對應類型作用說明典型值
FLT_MIN/FLT_MAXfloat單精度浮點數最小/最大值1.175e-38F/3.402e+38F
FLT_DIGfloat單精度可精確表示的十進制位數6(如0.123456可精確存儲)
DBL_MIN/DBL_MAXdouble雙精度浮點數最小/最大值2.225e-308/1.797e+308
DBL_DIGdouble雙精度可精確表示的十進制位數15
FLT_EPSILONfloat1.0與下一個可表示單精度值的差值(精度)1.192e-07F

適用場景

  • 整數溢出檢查:if (a > INT_MAX - b) { /* 處理溢出 */ }
  • 浮點數比較:避免直接用==,而用fabs(a - b) <= DBL_EPSILON判斷近似相等

二、編譯器標識與版本常量:跨編譯器兼容

這類常量用于識別當前編譯器(如GCC、MSVC)及版本,解決不同編譯器語法差異(如對齊方式、擴展特性)。

常量名稱所屬編譯器作用說明版本細節
__GNUC__GCC/Clang標識GCC或兼容編譯器,值為主版本號(如GCC 13.2.0為13)__GNUC_MINOR__(次版本)、__GNUC_PATCHLEVEL__(補丁版本)
__clang__Clang標識Clang編譯器(獨立于GCC)__clang_major__(主版本)、__clang_minor__(次版本)
_MSC_VERMSVC(VS編譯器)標識微軟編譯器,值為版本編碼(1930→VS2022,1920→VS2019)
__INTEL_COMPILERIntel C++標識Intel編譯器,值為版本號(如202103表示2021.3版本)__INTEL_COMPILER_UPDATE(更新版本)

適用場景:編譯器專屬語法適配,如結構體對齊:

// 兼容GCC和MSVC的1字節對齊
#ifdef __GNUC__
struct Test { char a; int b; } __attribute__((packed)); // GCC專屬
#elif _MSC_VER
#pragma pack(1) // MSVC專屬
struct Test { char a; int b; };
#pragma pack()
#endif

三、語言標準常量:特性兼容性判斷

這類常量用于判斷當前編譯使用的C/C++標準版本,確保代碼只在支持對應特性的環境中生效。

3.1 C語言標準

常量名稱作用說明取值與對應標準
__STDC__標識是否符合C標準(宿主環境下定義為1)僅啟用標準模式時有效(如-std=c99
__STDC_VERSION__具體C標準版本編碼(__STDC__=1時有效)199901L→C99,201112L→C11,201710L→C17

3.2 C++語言標準

__cplusplus是C++的核心標識,其值直接對應標準版本:

取值對應標準關鍵特性示例
199711LC++98/C++03基本類、模板基礎
201103LC++11nullptrauto、Lambda
201703LC++17std::string_view、折疊表達式
202002LC++20概念(Concepts)、模塊

注意:MSVC在VS2017及以前需加/Zc:__cplusplus才能正確顯示__cplusplus值。

適用場景:條件啟用語言特性:

#if __cplusplus >= 201703L // C++17及以上支持string_view
#include <string_view>
#else
#include <string>
#endif

四、文件與路徑常量:代碼定位的核心

這類常量用于獲取當前代碼的文件信息,是日志打印、錯誤定位的基礎工具。

常量名稱作用說明特性與示例
__FILE__展開為當前源文件路徑字符串(雙引號包裹)GCC默認相對路徑("main.c"),MSVC默認絕對路徑("D:\\proj\\main.c"
__BASE_FILE__展開為預處理入口文件路徑(區別于__FILE__a.c包含b.c,則b.c__BASE_FILE__"a.c"
__FILE_NAME__C++20標準,展開為文件名(不含路徑)__FILE__"dir/file.h",則__FILE_NAME__"file.h"

適用場景:日志中嵌入文件信息:

#define LOG(msg) printf("[%s] %s\n", __FILE__, msg) // 輸出帶文件名的日志

五、行號與函數常量:調試定位的關鍵

這類常量用于獲取代碼行號和函數名,是斷言、調試日志的核心補充。

常量名稱作用說明示例與適用標準
__LINE__展開為當前行號整數(預處理階段動態更新)第20行寫printf("%d", __LINE__)輸出20(所有標準支持)
__func__展開為當前函數名字符串(C99/C++11及以上)void foo() { printf("%s", __func__); }輸出foo
__PRETTY_FUNCTION__GCC/Clang擴展,展開為詳細函數信息(含參數、模板)模板函數template <typename T> void foo(T)展開為void foo(int)(T=int時)
__FUNCSIG__MSVC擴展,類似__PRETTY_FUNCTION__,含調用約定(如__cdeclvoid foo(int)展開為void __cdecl foo(int)

適用場景:自定義斷言定位錯誤:

#define MY_ASSERT(cond) do { \if (!(cond)) { \fprintf(stderr, "Assert failed: %s at %s:%d\n", #cond, __FILE__, __LINE__); \exit(1); \} \
} while(0)

六、日期與時間常量:編譯信息記錄

這類常量記錄編譯時的日期和時間(非運行時),用于版本追溯。

常量名稱作用說明格式示例
__DATE__編譯日期字符串,格式"Mmm dd yyyy"(如"Aug 27 2024""Jan 01 2025"
__TIME__編譯時間字符串,格式"hh:mm:ss"(24小時制,如"15:30:45""09:05:12"
__TIMESTAMP__GCC/Clang擴展,帶星期的完整時間("Day Mmm dd hh:mm:ss yyyy""Wed Aug 27 15:30:45 2024"

適用場景:程序版本信息展示:

cout << "Version: v1.0\nCompile: " << __DATE__ << " " << __TIME__ << endl;

七、平臺與環境標識:跨平臺開發的基礎

這類常量用于區分操作系統、處理器架構,是跨平臺代碼適配的核心。

7.1 操作系統標識

常量名稱標識的操作系統適用編譯器
_WIN32Windows(32/64位均定義)MSVC、MinGW、Clang(Windows)
_WIN64Windows 64位系統同上
__linux__Linux系統GCC、Clang(Linux)
__APPLE__Apple系統(macOS、iOS)Clang(Xcode)、GCC(舊版Xcode)
__ANDROID__Android系統Clang(NDK)

7.2 處理器架構標識

常量名稱標識的架構適用場景
__x86_64__64位x86(AMD64/Intel 64)Linux/macOS的GCC/Clang、MinGW64
_M_X6464位x86(MSVC專屬)MSVC(64位編譯)
__arm__32位ARM(如ARMv7)嵌入式ARM開發
__aarch64__64位ARM(AArch64)ARM Linux、iOS 64位

適用場景:跨平臺函數適配(如休眠):

#ifdef _WIN32
#include <windows.h>
#define SLEEP(s) Sleep(s * 1000) // Windows Sleep單位為毫秒
#elif __linux__ || __APPLE__
#include <unistd.h>
#define SLEEP(s) sleep(s) // Linux/macOS單位為秒
#endif

八、其他實用常量與使用準則

8.1 其他關鍵常量

  • __STDC_HOSTED__:標識是否為宿主環境(有完整標準庫,定義為1),嵌入式開發中判斷是否可用printf
  • __bool_true_false_are_defined:C99標識,定義為1時支持<stdbool.h>booltruefalse
  • __alignof__(GCC)/_Alignof(C11):返回類型對齊字節數(如__alignof__(int)通常為4)。

8.2 使用準則

  1. 優先使用標準宏:如__FILE__INT_MAX(跨編譯器兼容),謹慎使用擴展宏(如__PRETTY_FUNCTION__)。
  2. 避免重定義:預定義常量由編譯器管理,不可顯式#define(如#define __LINE__ 100會導致未定義行為)。
  3. 跨平臺路徑處理__FILE__在Windows用\,Linux用/,需統一分隔符(如替換\/)。

C/C++預定義常量是覆蓋編譯環境、語言標準、代碼定位、數值邊界的“全方位工具”。從防止INT_MIN溢出的數值計算,到用__FILE__/__LINE__定位錯誤,再到通過__linux__/_WIN32實現跨平臺兼容,這些常量貫穿開發全流程。

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

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

相關文章

嵌入式學習筆記--LINUX系統編程--DAY03進程控制

1.進程概述進程和程序的區別程序&#xff1a;程序是存儲在存儲介質上的一個可執行文件---靜態的進程&#xff1a;進程是程序的執行實例。可以說進程就是正在執行的程序。程序是一些指令的集合&#xff0c;而進程是程序的執行過程&#xff0c;這個過程的狀態是變化的&#xff0c…

【90頁PPT】新能源汽車數字化轉型SAP解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808859/91777751 資料解讀&#xff1a;《新能源汽車數字化轉型SAP解決方案》 ??詳細資料請看本解讀文章的最后內容?? 在全球汽車產業加速向電…

LSM6DS3姿態芯片和LIS2MD磁力計芯片數據讀取(stm32)

上代碼main.c 代碼示例#include "lsm6ds3.h" #include "lis2md.h"int16_t Acc[3] {0}, GYO[3] {0},Mag[3] {0};int main(void) {I2C_GPIO_Config(); //配置IIC使用端口Delayms(500); //延時Lsm6ds3_Init( ); …

數據傳輸安全-IKE工作過程

在前面的課程中&#xff0c;你已經掌握了&#xff1a;IPSec的目標&#xff1a;提供機密性、完整性、身份認證、防重放。IPSec的執行者&#xff1a;AH和ESP協議。IPSec的規則手冊&#xff1a;SA&#xff08;安全關聯&#xff09;&#xff0c;包含了所有保護參數&#xff08;算法…

翻譯-同位協同克里金算法

同點協同克里金法 副標題: 地統計學課程 主要內容: 同點協同克里金法 摘要 同點協同克里金法是一種多元地統計學技術,用于借助次要變量(協變量)來估算主要變量。本課程介紹了同點協同克里金法,并將其與簡單克里金法和簡單協同克里金法進行了比較。通過一個假設的案例…

國家統計局數據分析01——機器學習

我們前面爬取過國家統計局數據爬取——機器學習-CSDN博客的數據,我們接下來就對爬取的數據進行分析。 這是一個完整的數據分析代碼,主要用于加載、清洗和探索政府統計數據。讓我為你詳細解釋每個部分: 1. 導入必要的庫 import pandas as pd # 數據處理和分析的核心庫 imp…

【雜談】-混沌理論能否賦予機器差異化思考能力?

混沌理論能否賦予機器差異化思考能力&#xff1f; 文章目錄混沌理論能否賦予機器差異化思考能力&#xff1f;1、AI與結構化思維的本質特征2、人類思維的獨特優勢3、混沌算法的創新實踐4、混沌算法的作用機理5、混沌算法的應用實例5.1 音樂創作革新5.2 圖像生成突破5.3 科學發現…

jQuery.print插件:網頁內容打印與導出指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;在網頁開發中&#xff0c;為了實現內容的打印或導出&#xff0c;可以利用jQuery.print插件&#xff0c;該插件提供了一個簡易的解決方案&#xff0c;尤其適用于表格數據。本指南詳細介紹了如何使用jQuery.print…

w嵌入式分享合集125

自己的原文哦~ https://blog.51cto.com/whaosoft/14165530 一、常用電路基礎公式 1.歐姆定律計算 計算電阻電路中電流、電壓、電阻和功率之間的關系。 歐姆定律解釋了電壓、電流和電阻之間的關系&#xff0c;即通過導體兩點間的電流與這兩點間的電勢差成正比。說…

Docker 核心技術:Union File System

大家好&#xff0c;我是費益洲。UnionFS 作為 Docker 的技術核心之一&#xff0c;實現了 Docker 鏡像的分層輕量化構建、容器資源的隔離復用等目的。本文將從核心原理、主流技術實現簡單介紹 UnionFS。 核心原理 Linux 的聯合文件系統&#xff08;Union File System&#xff0c…

MongoDB 文檔模型設計:JSON 結構的靈活性與陷阱

MongoDB 文檔模型設計&#xff1a;JSON 結構的靈活性與陷阱第一章&#xff1a;MongoDB 文檔模型基礎與核心特性1.1 MongoDB 文檔模型的哲學基礎1.2 文檔模型的優勢分析1.3 與關系型數據庫的深度對比第二章&#xff1a;文檔設計模式與最佳實踐2.1 嵌入式模式&#xff08;Embeddi…

基于SQL大型數據庫的智能問答系統優化

一、食用指南 基于SQL數據庫的智能問答系統設計與實現介紹了在數據庫中創建表格數據問答系統的基本方法&#xff0c;我們可以向該系統提出關于數據庫數據的問題&#xff0c;最終獲得自然語言答案。 為了針對數據庫編寫有效的查詢&#xff0c;我們需要向模型提供表名、表結構和…

【計算機網絡】前端基礎知識Cookie、localStorage、sessionStorage 以及 Token

一、先搞懂&#xff1a;為什么需要這些“存儲工具”&#xff1f; 網頁是“無狀態”的——比如你登錄一個網站&#xff0c;瀏覽器和服務器每次通信都是獨立的&#xff0c;服務器默認記不住你是誰。為了讓服務器“記住”用戶狀態&#xff08;比如登錄狀態、購物車內容&#xff09…

【語法】【C+V】【mermaid】本身常用圖表類型用法快查【CSDN不支持,VSCODE可用】

文章目錄 Mermaid 簡介Mermaid 由三部分組成Mermaid 的使用方法復雜圖表結構的技巧餅圖簡介餅圖語法餅圖示例雷達圖簡介雷達圖語法雷達圖語法細節標題軸曲線選項 雷達圖示例時間線簡介時間線語法時間線示例樹形圖簡介樹形圖語法樹形圖示例數據包圖簡介數據包圖語法1&#xff1a…

不止效率工具:AI 在文化創作中如何重構 “靈感邏輯”?

一、引言1.1 AI 創作的崛起在當今時代&#xff0c;AI 技術在文化創作領域的迅猛發展已成為不可忽視的現象。從文字創作領域中&#xff0c;AI 能夠快速生成小說、詩歌&#xff0c;一些新聞媒體也開始運用 AI 撰寫新聞稿件&#xff1b;到視覺藝術方面&#xff0c;AI 繪畫軟件能依…

軟考-系統架構設計師 專家系統(ES)詳細講解

個人博客&#xff1a;blogs.wurp.top 一、ES的核心概念與價值 1. 什么是專家系統&#xff08;ES&#xff09;&#xff1f; 專家系統是一種模擬人類專家解決特定領域問題的智能計算機程序系統。它運用特定領域內大量專家水平的知識和經驗&#xff0c;進行推理和判斷&#xff…

Vue3+TS+Element-Plus+el-tree創建樹節點

1、一級樹應用效果&#xff1a;代碼&#xff1a;MaterialCategory.vue<script setup lang"ts" name"MaterialCategory"> ...... // 創建樹&#xff08;一級樹&#xff09; const createTree (dataList: IMaterialCategory[]) > {// 將原始數據轉…

C++基礎(④鏈表反轉(鏈表 + 迭代 / 遞歸))

鏈表反轉&#xff08;鏈表 迭代 / 遞歸&#xff09; 題目描述&#xff1a;給你單鏈表的頭節點 head&#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表頭節點。 示例&#xff1a;輸入鏈表 1→2→3→4→5 → 輸出 5→4→3→2→1。 思路提示&#xff1a;迭代法&#xff1a…

面向企業級產品開發的自動化腳本實戰

引言&#xff1a; 在產品開發團隊中&#xff0c;設計師、產品經理和工程師之間的協作常常伴隨著大量重復性工作&#xff1a;手動整理設計稿鏈接、更新產品需求文檔、同步項目狀態...這些工作不僅耗時&#xff0c;還容易出錯。本文將帶你編寫一個Python腳本&#xff0c;自動化這…

科技賦能生態,智慧守護農林,匯嶺生態開啟農林產業現代化新篇章

在我國&#xff0c;農林業作為國民經濟的基礎產業&#xff0c;不僅關乎國家糧食安全與生態平衡&#xff0c;更是鄉村振興戰略實施的核心領域。近年來&#xff0c;國家高度重視“三農”問題&#xff0c;大力推進鄉村振興戰略&#xff0c;強調要實現農業農村現代化&#xff0c;促…