警告:隐式声明posix_memalign函数

5
我正在使用Ubuntu 15.04上的GCC 4.9。我在Eclipse CDT中编写C程序,其方言设置为c99。出于某种原因,我的编译器一直警告我:隐式声明函数'posix_memalign'[-Wimplicit-function-declaration]。我不确定原因。我在顶部有#include ,当我使用eclipse时,ctrl + click posix_memalign会将我带到stdlib.h中的函数声明。 为什么我会收到此警告?我刚刚尝试将dialect更改为std = gnu99,这解决了问题。posix_memalign是否未包含在c99中?

3
要求:_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600。 翻译:必须满足 _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 这个条件。 - Sourav Ghosh
1
@PoojaNilangekar:也许是因为它们在 fenv.h 中?不要在自己的源文件中声明标准函数! - too honest for this site
2
你检查了那些。我的值更大。你不需要检查那些。相反,在 #include <stdlib.h> 之前,需要添加类似于以下的一行代码:#define _POSIX_C_SOURCE (200112L) - user3629249
1
将“-D_POSIX_C_SOURCE=200112L”作为命令行选项传递给编译器也可以完成此任务。 - alk
1
@PoojaNilangekar,自己编写系统函数的原型是个不好的主意。相反,应该阅读所需函数的man页。man页会指示需要包含哪些头文件以及需要使用哪个#define来使头文件实际定义这些原型。或者可以通过在环境变量中使用'set'命令,将适当的字符串放置在.profile或类似文件中。 - user3629249
显示剩余5条评论
1个回答

6

在任何#include行之前,必须定义#define _POSIX_C_SOURCE 200809L和其他特性测试宏

这是因为这些宏告诉标准C库头文件应该提供哪些功能,以及/或者替代标准C库的功能; 这些功能在#include点被“锁定”。

posix_memalign()stdlib.h提供,但仅在启用POSIX.1-2001或更高版本时才可用;这意味着需要将_POSIX_C_SOURCE定义为200112L或更大(L在此处是因为它是long类型的整数常量),或将_XOPEN_SOURCE定义为600或更大。

只有当出现以下情况时才会显示错误:

  1. 在包含 stdlib.h 时宏未被定义

    或者

  2. stdlib.h 未被包含

    或者

  3. C 库实现不提供 POSIX.1 特性

在 Ubuntu 中使用 GCC,原因必须是前两种情况之一,因为 C 库肯定提供了这些 POSIX.1 特性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接