【问题标题】:Warning Implicit Declaration of posix_memalignposix_memalign 的警告隐式声明
【发布时间】:2015-09-07 12:15:58
【问题描述】:

我在 ubuntu 15.04 上使用 GCC 4.9。我在eclipse CDT中编码。这是一个方言设置为 c99 的 C 程序。出于某种原因,我的编译器一直警告我这...

warning: implicit declaration of function ‘posix_memalign’ [-Wimplicit-function-declaration]

我不知道为什么。我在顶部有#include<stdlib.h>,当我使用 eclipse 时,ctrl+click posix_memalign 会将我带到 stdlib.h 中的函数声明。为什么我会收到此警告?

我刚刚尝试将 dialext 更改为 std=gnu99,这解决了问题。 posix_memalign 不包含在 c99 中吗?

【问题讨论】:

  • 要求:_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
  • @PoojaNilangekar:也许是因为他们在fenv.h?不要在自己的源文件中声明标准函数!
  • “你检查了那些。我的价值观更大”你不检查那些。而在 #include <stdlib.h> 之前需要有一行类似于:`#define _POSIX_C_SOURCE (200112L)`
  • -D_POSIX_C_SOURCE=200112L 作为命令行选项传递给编译器也可以完成这项工作。
  • @PoojaNilangekar,为系统功能编写自己的原型是个坏主意。相反,请阅读手册页以了解所需的功能。手册页指出需要包含哪些头文件以及使头文件实际定义这些原型需要什么#define。或通过 'set' 将适当的字符串放置在您的环境中,在 .profile 或类似文件中。

标签: c linux gcc posix


【解决方案1】:

#define _POSIX_C_SOURCE 200809L 和其他 feature test macros 必须在任何 #include 行之前定义。

这是因为宏告诉标准 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 特性。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多