You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:36:02