"Implict declaration" 来自 c 标准库的函数? (头文件已经包含)

"Implict declaration" of a function from c standard library? (the header file has already been included)

函数 gcvt 包含在 stdlib.h 中。 当我尝试编译时:

    gcc -std=c99 problem.c 2.c -o problem

我得到的信息:

     warning: implicit declaration of function ‘gcvt’ [-Wimplicit-function-declaration]
 fstr = gcvt(datad,10,buff); 

并且无法正确执行

但我可以通过在 2.c 函数测试之前添加一行来解决这个问题:

   char *gcvt(double number, int ndigit, char *buf);

有谁知道为什么吗?

这是我的代码:

2.c

    #include "2.h"
    //char *gcvt(double number, int ndigit, char *buf);--must add this line
    void test() {

        double datad = 2.3;

        char buff[100];
        char *fstr; 
        fstr = gcvt(datad,10,buff); 


        printf("%s",fstr);
   }

2.h

    #ifndef XXX 
    #define XXX 
    #include<stdlib.h>
    #include<stdio.h>
    void test();
    #endif

problem.c

    #include "2.h"

    int main()
    {
        test();    
        return 0;
    }    

您要调用的函数在 15 年前已被标记为过时。阻止人们使用这些函数(实际上没有破坏程序)的正常方法是将函数的实现保留在标准库中,但从头文件中删除声明(或至少使其难以启用)。

使用 snprintf 来完成同样的事情。

gcc 的手册页说:

  gcvt(): _SVID_SOURCE || _XOPEN_SOURCE >= 500

这意味着定义依赖于宏。

在任何#include指令之前添加:

#define _SVID_SOURCE

手册页还建议您改用 snprintf,因为 gcvt 已弃用。

在大多数系统上,-std=c99 选项(实际上是 gcc 预定义的 __STRICT_ANSI__ 宏)导致系统 headers 遵守 C 标准的标识符可以暴露在命名空间中。由于 gcvt 不是标准函数,因此无法公开。如果你想请求它,你可能需要定义一个 Feature Test Macro 就像 _XOPEN_SOURCE=600 (第 6 期是单一 Unix 规范的最后一个版本来支持这个 long-obsolete 函数)在包含任何标准 headers 之前;最简单的方法是在命令行上:

gcc -D_XOPEN_SOURCE=600 ...

但实际上你应该听从其他答案的建议并使用 snprintf,而不是这个 long-obsolete 垃圾函数。

gcvt() 是否在标准库中是一个解释问题。它不属于 C 定义的标准库函数。它在 POSIX.1-2001 中被记录为遗留函数,但在 POSIX.1-2008 中已被完全删除,所以现在没有什么标准。

然而,作为一个实际问题,它在 Glibc 中 ,并且 stdlib.h 是其原型的正确 header,所以你可以说它是在这个意义上的标准库中。就我个人而言,我认为这是误导和/或误解。

查阅您不完全熟悉的函数的文档通常是个好主意。在这种情况下,你会发现在Glibc docs for this function中它有一个feature-test宏要求:

Since glibc 2.12:

_SVID_SOURCE ||
    (_XOPEN_SOURCE >= 500 ||
        _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
    !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)

为了使原型可用,在处理 stdlib.h 时,预处理器条件必须评估为真。您可以通过确保符号 _XOPEN_SOURCE 定义为值 500 并且 _POSIX_C_SOURCE 未定义或定义的值小于 200112L 来提供这一点。例如,将 -D_XOPEN_SOURCE=500 传递给 gcc