为何使用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




