当前位置: 首页 > web >正文

__STDC_VERSION__

__STDC_VERSION__ 是 C 语言中的预定义宏,用于标识编译器遵循的 ​C 语言标准版本。其值是一个长整型常量(long),格式为 yyyymmL(年份 + 月份 + L 后缀)。以下是关键信息整理:

一、各版本 C 标准对应的宏值

C 标准版本__STDC_VERSION__ 值说明
C89/C90未定义该标准未定义此宏 
C99199901L1999 年 1 月发布 
C11201112L2011 年 12 月发布 
C17/C18201710L2017 年 10 月发布 

二、核心用途

  1. 条件编译
    根据 C 标准版本启用/禁用特定代码,确保兼容性。例如,C99 支持循环内声明变量,而 C89 不支持:

    #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901Lfor (int i = 0; i < 5; i++) {  // C99+ 支持
    #elseint i;  // C89 兼容写法for (i = 0; i < 5; i++) {
    #endif

    用途:跨版本兼容代码设计 。

  2. 运行时版本检测
    动态输出当前 C 标准版本:

    #include <stdio.h>
    int main() {#if defined(__STDC_VERSION__)printf("C Standard: %ld\n", __STDC_VERSION__);#elseprintf("C89/C90 or earlier\n");#endifreturn 0;
    }

    用途:库或框架的环境适配 。

  3. 兼容性检查
    若需强制使用 C11 或更高版本:

    #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L#error "Requires C11 or later"
    #endif

    用途:拒绝低版本编译 。

三、注意事项

  1. 未定义场景
    在 C89/C90 或非标准编译器下,__STDC_VERSION__ 未被定义,需用 #ifdef 或 #if defined() 检查 

    #ifndef __STDC_VERSION__// C89 兼容代码
    #endif
  2. 与 __STDC__ 的区别

    • __STDC__:标识编译器是否遵循 ANSI C 标准​(值为 1 表示遵循)。
    • __STDC_VERSION__:提供具体的标准版本号​(仅 C99 及以后有效)。
  3. 编译器差异
    部分编译器(如 GCC)可通过编译选项(如 -std=c11)控制此宏的值。

四、典型应用场景

  • 嵌入式开发​:针对不同硬件平台选择内存对齐或紧凑结构(结合 __attribute__((aligned)) 等)。
  • 跨平台库​:根据 C 标准启用特性(如泛型选择、原子操作等)。
  • 代码弃用管理​:配合 __attribute__((deprecated)) 标记旧接口 。

示例:检测标准并输出版本信息

#include <stdio.h>
int main() {#ifdef __STDC_VERSION__#if __STDC_VERSION__ >= 201710Lprintf("C17/C18\n");#elif __STDC_VERSION__ >= 201112Lprintf("C11\n");#elseprintf("C99\n");#endif#elseprintf("Pre-C99\n");#endifreturn 0;
}

总结​:__STDC_VERSION__ 是编写可移植 C 代码的核心工具,通过条件编译实现不同标准的无缝适配。开发者应始终检查其是否定义,并合理处理 C89 场景 。

http://www.xdnf.cn/news/10504.html

相关文章:

  • 路由策略与路由控制
  • Linux系统配置网络优先级
  • Wavelib 库的核心属性、方法
  • Sa-Token 同端登录冲突检测实战
  • 箱式不确定集
  • Baklib加速企业AI数据治理实践
  • AtCoder Beginner Contest 399题目翻译
  • 前端面经 响应式布局
  • 2023ICPC杭州题解
  • 文档核心结构优化(程序C++...)
  • TensorFlow深度学习实战(19)——受限玻尔兹曼机
  • seq2seq 视频截图
  • 深度学习篇---人脸识别中的face-recognition库和深度学习
  • 【Canvas与色彩】八彩大风车
  • springboot-响应接收与ioc容器控制反转、Di依赖注入
  • nt!MiDispatchFault函数里面的nt!IoPageRead函数分析和nt!MiWaitForInPageComplete函数分析
  • URLDNS利用链剖析
  • latex figure Missing number, treated as zero. <to be read again>
  • mybatis01
  • 3、禁止树莓派屏幕休眠,设置树莓派屏幕常亮
  • VisionPro —— 不规则胶路检测
  • Codeforces Round 1028 (Div. 2) C. Gellyfish and Flaming Peony
  • java synchronized关键字用法
  • STM32Cubemx-H7-17-麦克纳姆轮驱动
  • 关于神经网络中的梯度和神经网络的反向传播以及梯度与损失的关系
  • 用Python打开不同联类型的文件
  • 【xmb】】内部文档148344599
  • 大数据学习(126)-窗口函数范围
  • 通过WiFi无线连接小米手机摄像头到电脑的方法
  • AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析