隐式的函数声明elleep[英] implicit declaration of function usleep

本文是小编为大家收集整理的关于隐式的函数声明elleep的处理方法,想解了隐式的函数声明elleep的问题怎么解决?隐式的函数声明elleep问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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的前条件.基本上,这是一个涉及#define变量的类似C的表达式,在包含标头文件之前必须是正确的.

标题文件本身只能定义usleep在通常的#ifdef陈述中,开发人员花了时间告诉您您需要做什么,以便您不必花费数小时试图自己弄清楚: - )

假设您使用glibc 2.12或更高,则意味着您必须:

  • 声明_bsd_source;或
  • 声明其他三件事的复杂组合,我不会理会地解码.

可能最简单的解决方法是简单地使用gcc -D _BSD_SOURCE或put:

#define _BSD_SOURCE

在包含给您usleep的标头文件之前,在代码中.

,您可能需要在 中定义这些定义,以防各种标头文件之间存在依赖关系.

其他推荐答案

这可能有效:添加-std=gnu99在Linux上使用GCC编译时.

示例:

arm-linux-gcc -lpthread -std=gnu99  -o test ArmLinuxDataPipe1.2.1.c

其他推荐答案

tl; dr

如果您需要获取使用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()未弃用.

另外 - 如果这是新代码,则肯定是 nanosleep() nanosleep() nanosleep() a>,为您的库版本适当设置功能测试宏,并查看其他位腐烂的代码库.

在Linux上,您可以检查_XOPEN_SOURCE和_POSIX_C_SOURCE的值,您的库支持man feature_test_macros.

.

完整的图片

更长的答案:这是发生的事情.

历史上有几种不同的UNIX标准,每个人都打的最终最佳练习是让代码指定其编写的UNIX API版本.程序员通过定义功能测试宏来做到这一点.

UNIX最早的分裂之一是在AT&T系统V与加利福尼亚大学的伯克利标准分销(BSD)之间.由于System V是官方版本,其行为变成了默认版本,而BSD Unix是最早的免费软件,并且在许多大学中使用,因此与_SVID_SOURCE相比,看到Legacy Code声明_BSD_SOURCE更为普遍. _BSD_SOURCE宏特别试图在40多年的时间内从各种不同的操作系统中扩展.有时,它甚至被用作非标准扩展的全部内容.这两个宏都被弃用,并且与当前所接受的答案相反,您绝对不应使用新代码中的任何一个.

在本世纪,有两个Unix标准Posix,它们成为IEEE标准,以及开放组的单个UNIX规范(SUS)(X/Open). X/Open SU​​S是POSIX的超级,您通常会写的.过去,您可以声明许多不同的特征测试宏,以启用这些标准的当时版本,并且仍然支持这些标准的后退兼容性.您可以在粘贴的条件下看到其中的一些,但是当您编写新代码时,您不必担心它们.代码检查的一个宏(_XOPEN_SOURCE_EXTENDED)现在已经过时了,但是从历史上看,从1995年开始选择了SUS的版本.

从理论上讲,在任何现代版本的UNIX或Linux上设置的正确特征测试宏都是_XOPEN_SOURCE.您应该查找库支持的最新版本号.在实践中,我认为也定义_POSIX_C_SOURCE是审慎的防御性编码,以确保保证没有其他人可以不一致地设置它并破坏您的代码.您的问题是一个很好的例子:如果您设置了_XOPEN_SOURCE以供向后兼容,但是_POSIX_C_SOURCE设置为工具链中其他位置的最新版本,则更高版本的_POSIX_C_SOURCE将优先考虑,_POSIX_C_SOURCE不会工作.

因此,这些条件是usleep()不是POSIX函数,而是在某些BSD样OS上存在的一次,因此在1995年成为SUS.从那时起,选择任何版本的POSIX或SUS,然后积极地将其禁用.因此,如果您选择SUS的500版或600版(以及其他一个过时的同义词也将其打开),则可以启用它,但是如果您选择了任何最近版本的POSIX或SUS,则将其弃用.如果您选择了任何内容选项,也可以启用它们,但这是一个坏主意.

本文地址:https://www.itbaoku.cn/post/358962.html