You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何使用usleep()时会抛出‘implicit-declaration’警告?

为何使用usleep()时会抛出‘implicit-declaration’警告?

这个问题我之前也碰到过,核心原因是usleep()已经被POSIX标准废弃了!

具体原因

POSIX.1-2001标准就把usleep()标记为过时,到了POSIX.1-2008直接移除了这个函数的定义。所以现在大多数现代系统的<unistd.h>头文件,默认情况下不会声明usleep()——除非你显式告诉编译器要启用旧版本POSIX的兼容特性。

解决办法有两种,推荐第二种:

  • 方法一:启用旧POSIX兼容宏
    在所有头文件包含之前,定义_POSIX_C_SOURCE宏为199506L(这是包含usleep()的最后一个标准版本),这样编译器就会从<unistd.h>里加载usleep()的声明:

    #define _POSIX_C_SOURCE 199506L
    #include <stdio.h>
    #include <unistd.h>
    
    int main() {
        for(int i = 0; i <= 10; i++) {
            printf("\r%d", i);
            fflush(stdout);
            usleep(500000);   // 0.5 seconds
        }
    
        printf("\n");
        return 0;
    }
    
  • 方法二:用标准推荐的nanosleep()替代
    nanosleep()是POSIX标准保留的函数,功能更强大(比如能处理被信号中断的情况),而且不会有兼容性问题。把你的usleep(500000)替换成以下代码就行:

    #include <stdio.h>
    #include <time.h>  // 需要包含这个头文件
    
    int main() {
        for(int i = 0; i <= 10; i++) {
            printf("\r%d", i);
            fflush(stdout);
            
            struct timespec req = {0};
            req.tv_sec = 0;
            req.tv_nsec = 500000000L;  // 0.5秒 = 500,000,000纳秒
            nanosleep(&req, NULL);
        }
    
        printf("\n");
        return 0;
    }
    

另外提一句,有些系统可能通过定义_GNU_SOURCE_BSD_SOURCE宏也能让usleep()生效,但这会引入非标准特性,不推荐在跨平台代码里这么用。

备注:内容来源于stack exchange,提问作者Bobby

火山引擎 最新活动