__STDC_VERSION__
__STDC_VERSION__
是 C 语言中的预定义宏,用于标识编译器遵循的 C 语言标准版本。其值是一个长整型常量(long
),格式为 yyyymmL
(年份 + 月份 + L
后缀)。以下是关键信息整理:
一、各版本 C 标准对应的宏值
C 标准版本 | __STDC_VERSION__ 值 | 说明 |
---|---|---|
C89/C90 | 未定义 | 该标准未定义此宏 |
C99 | 199901L | 1999 年 1 月发布 |
C11 | 201112L | 2011 年 12 月发布 |
C17/C18 | 201710L | 2017 年 10 月发布 |
二、核心用途
-
条件编译
根据 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
用途:跨版本兼容代码设计 。
-
运行时版本检测
动态输出当前 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; }
用途:库或框架的环境适配 。
-
兼容性检查
若需强制使用 C11 或更高版本:#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L#error "Requires C11 or later" #endif
用途:拒绝低版本编译 。
三、注意事项
-
未定义场景
在 C89/C90 或非标准编译器下,__STDC_VERSION__
未被定义,需用#ifdef
或#if defined()
检查#ifndef __STDC_VERSION__// C89 兼容代码 #endif
-
与
__STDC__
的区别__STDC__
:标识编译器是否遵循 ANSI C 标准(值为1
表示遵循)。__STDC_VERSION__
:提供具体的标准版本号(仅 C99 及以后有效)。
-
编译器差异
部分编译器(如 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 场景 。