24. 标准版本、可选能力与扩展
C 标准库里有一部分能力属于“可选扩展”或“按实现决定是否提供”的接口。阅读和使用这部分内容时,核心不是记住函数名,而是先做能力探测,再决定是否启用扩展路径。
本节可跳过
这些内容在不同工具链上的支持度差异较大,且不少项目不会用到。若当前目标是先掌握主线语法,可以先跳过,后续按需回看。
1. Annex K 与 __STDC_WANT_LIB_EXT1__
C11 引入了可选的边界检查接口族(常见为 *_s)。启用方式通常是在包含相关头文件前定义 __STDC_WANT_LIB_EXT1__ 为 1,然后再通过 __STDC_LIB_EXT1__ 判断实现是否真的提供了这组接口。
c
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#if defined(__STDC_LIB_EXT1__)
/* 可使用 memcpy_s / strcpy_s 等接口 */
#endif1
2
3
4
5
6
2
3
4
5
6
2. 其他可选能力的探测思路
并发、原子等能力也可能由实现通过特性宏声明缺失,例如 __STDC_NO_THREADS__、__STDC_NO_ATOMICS__。这类宏的价值在于把“是否支持”前置到编译期,而不是把问题留到运行期。