为何指定C99标准编译时,clock_gettime相关代码无法通过编译?
问题原因
你不显式指定编译标准时,clang默认使用带GNU扩展的C标准(通常为gnu11/gnu17版本),默认开启POSIX相关特性的声明。而struct timespec、clock_gettime、CLOCK_REALTIME都不属于C99标准的原生内容,是POSIX标准定义的接口,当你显式指定-std=c99时,编译器会进入严格C99兼容模式,默认关闭POSIX特性的暴露,time.h头文件不会导出这些符号,因此会出现类型不完整、函数隐式声明、标识符未定义的报错。
解决方法
要在指定C99标准的同时使用这类POSIX接口,需要提前声明开启POSIX特性:
- 方法1:编译时添加宏定义参数,使用如下命令即可正常编译
clang -std=c99 -D_POSIX_C_SOURCE=200809L m.c && ./a.out && rm ./a.out - 方法2:在代码所有
#include语句之前添加宏定义,修改后的代码开头如下:#define _POSIX_C_SOURCE 200809L #include <stdio.h> #include <time.h> // 后续代码保持不变
可参考的学习资料
- 各版本C语言标准官方文档,可以明确不同C版本原生提供的标准库接口范围,区分原生接口和平台扩展接口
- POSIX标准官方文档,可以查阅系统类C接口的定义、依赖的特性宏、使用要求
- 所用编译器(clang/gcc)的官方手册,可以了解不同编译标准选项的行为、特性开关的具体规则
- 操作系统的man手册,执行
man 3 clock_gettime即可看到该接口的头文件依赖、需要定义的宏、参数说明等官方说明
内容的提问来源于stack exchange,提问作者Eric Stotch
相关产品推荐
相关产品推荐

