"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
。
函数 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
。