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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;促…