【问题标题】:implicit declaration using -std=c99使用 -std=c99 的隐式声明
【发布时间】:2012-02-28 09:39:33
【问题描述】:

我收到此警告:(-std=c99 -pedantic)

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

但我正在导入这些库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

那又怎样?! :(


// file.c:
    #include "file.h"
    strndup(...)
// file.h:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

【问题讨论】:

  • 你能告诉我们你如何调用 strndup 吗?并且它被称为包括不导入,那些是 C 头文件而不是库。
  • @mux:它的调用方式似乎无关紧要,问题很可能是 GCC 没有使用指定的标志提供这个函数声明(或者在 MinGW 的情况下根本没有)。跨度>
  • 尽管有警告,您的程序是否链接?正如上面的 2 个 cmets 所说,strndup 不在 MinGW 的标头或库中
  • @NiklasB。是的,你是对的,我认为上下文可能是相关的,抱歉。

标签: c gcc


【解决方案1】:

我的man strndup

glibc 的功能测试宏要求(参见 feature_test_macros(7)):

       strdup():
           _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* 从 glibc 2.12 开始: */ _POSIX_C_SOURCE >= 200809L
       strndup():
           从 glibc 2.10 开始:
               _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           在 glibc 2.10 之前:
               _GNU_SOURCE
       strdupa(), strndupa(): _GNU_SOURCE

所以我需要,例如,#define _POSIX_C_SOURCE 200809L您文件中的第一个 #include
man 7 feature_test_macros

【讨论】:

    【解决方案2】:

    这发生在我身上,我添加了#define _XOPEN_SOURCE 500,警告消失了。

    【讨论】:

      【解决方案3】:

      问题在于您对-std=c99 选项的使用。由于strndup() 不是 C99 的一部分,并且您要求编译器进入标准兼容模式,因此它不会为其提供原型。当然它仍然是链接,因为你的 C 库有它。

      虽然您可以通过自己指定功能宏来哄 gcc 提供它,但我想说的是,处于 C99 合规模式并没有多大意义并且要求 GNU例如扩展。 gcc 已经为此提供了一种模式,它将解决您的警告:-std=gnu99

      【讨论】:

      • gnu99 不是解决方案。定义正确的功能测试宏是解决方案。要使用 POSIX 中定义的接口,您必须在包含任何标头之前将 _POSIX_C_SOURCE 定义为所需的版本 (200809L)(如果您还想要完整的 XSI 选项,则必须将 _XOPEN_SOURCE 定义为)。
      • 我很确定 strndup() 也不是 POSIX。根据手册页,它是一个 GNU 扩展。与其使用功能测试宏来启用它,不如直接使用gnu99 模式?
      • 而至于为什么要以正确的方式去做,答案是它是可移植的。定义正确的功能测试宏将使您的程序在任何符合 POSIX 的系统上运行。使用“gnu99”将使您的程序在 Linux+glibc 上运行。实际上-std=gnu99 的目的主要是启用 GNU C compiler 扩展,它可以在 GCC 可用的任何地方工作,但 GNU libc 特定的 library 扩展不会普遍可用。
      • 有趣,感谢您的链接。您关于可移植性的论点是有道理的。我的主要意思是,如果您要使用 GNU 扩展功能,也可以只启用一般的 GNU 扩展——但是,我的手册页似乎可以使用更新。如果我们只想访问该功能,那么我同意这(即您所说的)可能是一个更好的解决方案。
      【解决方案4】:

      strndup 是 GNU 扩展,因此您需要在命令行上使用 -D_GNU_SOURCE 进行编译,或者在源文件中将 #define _GNU_SOURCE 1 添加到 #include 行之前

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        相关资源
        最近更新 更多