使用-std = c99的隐式声明

Fab*_*cio 13 c gcc

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

warning: implicit declaration of function ‘strndup’ [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)

但我正在导入这些库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

所以呢?!:(


// file.c:
    #include "file.h"
    strndup(...)
// file.h:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
Run Code Online (Sandbox Code Playgroud)

Fat*_*ror 30

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

虽然您可以gcc通过自己指定功能宏来哄骗提供它,但我会说在C99兼容模式下并且要求GNU扩展没有多大意义.gcc已经为此提供了一种模式,它将解决您的警告:-std=gnu99.

  • gnu99不是解决方案.定义正确的*功能测试宏*是解决方案.要使用POSIX中定义的接口,必须在包含任何标头之前将`_POSIX_C_SOURCE`定义为所需的版本(200809L)(如果您还需要完整的XSI选项,则必须定义`_XOPEN_SOURCE`). (11认同)
  • 奥斯汀集团有所不同:http://pubs.opengroup.org/onlinepubs/9699919799/functions/strndup.html (2认同)

pmg*_*pmg 8

man strndup

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup():
           _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
       strndup():
           Since glibc 2.10:
               POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           Before glibc 2.10:
               _GNU_SOURCE
       strdupa(), strndupa(): _GNU_SOURCE

所以我需要,例如,#define POSIX_C_SOURCE 200809L 第一次之前#include.
看到man 7 feature_test_macros


Chr*_*odd 6

strndup是GNU扩展,所以你需要编译-D_GNU_SOURCE的命令行上,或贴#define _GNU_SOURCE 1在之前在源文件#include

  • 实际上它是POSIX的一部分. (2认同)