gcc (GCC) 4.6.3
c89
我试图用usleep
。 不过,我不断收到以下警告:
函数usleep的隐式声明
我已经包含了unistd.h
头文件。
该名男子页提到了一些关于这一点。 但我不知道我的理解是:
usleep():
Since glibc 2.12:
_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
但不知道我一个与上述吗?
该列表是对于具有预先条件usleep
定义。 这基本上是一个类似C的表达涉及#define
变量具有包括头文件之前是真实的。
头文件本身只将定义usleep
里面是什么通常是一个巨大的鸟巢#ifdef
语句和开发人员所用的时间告诉你需要做什么,这样你就不必花时间试图自己看着办吧:-)
假设你正在使用glibc
2.12或更高,这意味着你要么必须:
- 声明_BSD_SOURCE; 要么
- 申报的其他三件事情,我不会刻意去解码复杂组合。
也许最简单的解决方法是简单地编译gcc -D _BSD_SOURCE
或放:
#define _BSD_SOURCE
在代码之前您包含头文件,让你usleep
。
你可能会想这些定义包括任何的情况下有不同的头文件之间的依赖关系之前。
这可能工作:添加-std=gnu99
在Linux上使用GCC编译时。
例:
arm-linux-gcc -lpthread -std=gnu99 -o test ArmLinuxDataPipe1.2.1.c
使用了nanosleep(),而不是为我工作。
在一个相关的注意事项:usleep()函式以来一直POSIX-2008取出,并建议使用了nanosleep()代替。
以下内容添加到您的代码的顶部:
// For `nanosleep()`:
#include <time.h>
#define __USE_POSIX199309
#define _POSIX_C_SOURCE 199309L
然后使用nanosleep()
代替,创建自己的sleep_us()
函数来睡觉微秒的一组数字:
void sleep_us(unsigned long microseconds)
{
struct timespec ts;
ts.tv_sec = microseconds / 1e6; // whole seconds
ts.tv_nsec = (microseconds % 1e6) * 1e3; // remainder, in nanoseconds
nanosleep(&ts, NULL);
}
编译和Linux上运行的Ubuntu,我创建了一个sleep_test.c文件和使用:
gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
参考文献:
- (这是故意循环引用:看我这个答案下评论): 有没有用C替代睡眠功能毫秒?
- http://man7.org/linux/man-pages/man2/nanosleep.2.html
文艺青年最爱的
如果您需要获得使用遗留代码usleep()
来编译,将这些行添加到您之前的任何其他库包含头文件:
#define _XOPEN_SOURCE 600
#define _POSIX_C_SOURCE 200112L
否则编译器标志添加-std=c11 -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112L
到你的makefile。
这告诉你的程序使用的环境, 这个旧版本的UNIX API的 ,其中usleep()
并没有过时。
另外,如果这是新的代码,绝对替换usleep()
使用nanosleep()
为你的库的版本设置适当的功能测试宏,并查看您的其他位腐烂的代码库。
在Linux上,您可以检查哪些值_XOPEN_SOURCE
和_POSIX_C_SOURCE
资料库中支持man feature_test_macros
。
完整的图片
较长的答案:这是怎么回事。
历史上有几个不同的UNIX标准,最终的最佳实践大家打是有指定的代码它是书面的UNIX API的是什么版本。 程序员通过定义一个功能测试宏这样做。
一个在UNIX最早拆分的是AT&T的System V和美国加州大学伯克利标准发行(BSD)之间。 由于系统V是官方版本,其行为成为默认的,而BSD Unix等是一些最早的自由软件,在许多高校中使用,它更经常可以看到遗留代码申报_BSD_SOURCE
比_SVID_SOURCE
。 该_BSD_SOURCE
宏尤其试图使从各种不同的操作系统的扩展一段四十余年。 有时,它甚至作为一个包罗万象的非标准扩展。 这两个宏过时,违背了当前接受的答案,你不应该使用任何一个新的代码。
在本世纪,出现了两个UNIX标准,POSIX,这成为一个IEEE标准,并从开放组的单一Unix规格(SUS)(X /开启)。 将在X / Open SUS是POSIX的超集,你通常会写。 曾经有许多不同的功能测试宏,你可以声明,以使这些标准当时的版本,而这些仍然支持向后兼容。 你可以看到其中的一些在你粘贴的条件,但你并不需要担心他们,当你写新代码。 一个宏代码检查, _XOPEN_SOURCE_EXTENDED
,现在已经过时,但在历史上选择一个版本的SUS的1995年。
从理论上讲,正确的功能测试宏在任何现代版本的UNIX或Linux的设置是_XOPEN_SOURCE
。 你应该查查你的库支持最新的版本号。 在实践中,我认为这是谨慎的防御性编码,也定义了_POSIX_C_SOURCE
,以确保没有其他人可以设置不一致,并破坏你的代码。 你的问题是一个很好的例子:如果你设置_XOPEN_SOURCE
向后兼容性,但_POSIX_C_SOURCE
获取工具链的其他地方设置为一个较新的版本,高版本的_POSIX_C_SOURCE
将优先考虑和usleep()
将无法正常工作。
那么,究竟那些条件句的意思是, usleep()
不是POSIX的功能,但在同一时间出现在一些类似BSD操作系统,因此使它成为1995年的SUS它是在2008年弃用,并选择任何版本POSIX或者SUS自那时以来积极禁用它。 因此,如果您选择的SUS(和另外一个过时的代名词也打开它)的500版或600它的启用,但如果你选择最近的任何POSIX或SUS的版本弃用。 如果你选择什么,去选择他们还启用了,但是这是一个坏主意。