nanosleep() stdc 编译错误

3 篇文章 0 订阅

摘要

从c99 开始, usleep() 已经被标识为deprecated(弃用),编译(c99/gnu99)会报错。并且提供新的nanlsleep() 可进行高达纳秒(ns, 十亿分之一秒 10的负9次方)级别精度的休眠函数。

简介

 函数原型

vim /usr/include/time.h

#ifdef __USE_POSIX199309
/* Pause execution for a number of nanoseconds.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern int nanosleep (const struct timespec *__requested_time,
>~~~~~~~>~~~~~~~      struct timespec *__remaining); 

从time.h 头文件的描述可以看出是要在c99 及以上的版本中才能支持。

错误

nanosleep() 在gcc 编译时, 指定c99/c11/gnu99并启用Werror 编译选项, 则会出现c99/c11 存在编译错误情况。而用g++ 无该问题。

cc:sleep$ cat -n nanosleep.c
     1  #include <stdio.h>
     2  #include <time.h>
     3  int main() {
     4     nanosleep(NULL, NULL);
     5      return 0;
     6  }
cc:sleep$ gcc -Werror -std=gnu99 nanosleep.c
cc:sleep$ gcc -Werror -std=c99 nanosleep.c
nanosleep.c: In function ‘main’:
nanosleep.c:4:4: error: implicit declaration of function ‘nanosleep’ [-Werror=implicit-function-declaration]
    4 |    nanosleep(NULL, NULL);
      |    ^~~~~~~~~
cc1: all warnings being treated as errors
cc:sleep$ gcc -Werror -std=c11 nanosleep.c
nanosleep.c: In function ‘main’:
nanosleep.c:4:4: error: implicit declaration of function ‘nanosleep’ [-Werror=implicit-function-declaration]
    4 |    nanosleep(NULL, NULL);
      |    ^~~~~~~~~
cc1: all warnings being treated as errors
cc:sleep$ g++ -Werror -std=c++11 nanosleep.c
cc:sleep$ g++ -Werror -std=c++03 nanosleep.c
cc:sleep$

结合 查阅的文档, 发现standard c 中是没有包含nanosleep() 的, 而在gnu c 中是包含有该函数的。因此在编译选项为std=c99 时, 就会出现编译错误。

解决方案

当使用std=c99/c11时, 若需要Linux 环境中使用nanosleep(), 则只需要在对应的C文件或者包含的头文件中包含nanosleep() 函数的声明既可。Linux 中默认均是使用gnu 环境的,因此是可以在环境库中查找到nanosleep() 的定义的。

若是在无gnu 的环境下(例如交叉编译), 仍要使用该函数,建议自己实现下nanosleep() 。不然linking 时也会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值