这个问题不是如何删除警告
我在写贝壳。我提到了这个来源。在我的代码中,我使用了与他相同的标题(按相同的顺序)。
在编译他的代码时,我不会收到任何关于隐式声明 of getline的警告。但是当我编译我的时,它确实会被抛出。
手册页建议使用#define _GNU_SOURCE,并添加了从我的代码中删除警告。
那么,为什么在博客中没有为代码抛出警告,因为他没有使用#define _GNU_SOURCE
下面是最低限度的代码(我复制了上面提到的所有标头)
// #define _GNU_SOURCE
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
ssize_t bytes_read;
size_t input_buffer_size = 1024;
char *user_input = (char *)malloc(input_buffer_size * sizeof(char));
while (1)
{
printf("> ");
bytes_read = getline(&user_input, &input_buffer_size, stdin);
printf("%s\n", user_input);
}
return 0;
}这是我使用的编译过程..。
gcc -std=c11 -o bin/shell src/shell.c这是如果我保留第一行注释的话会出现的错误。
src/shell.c: In function ‘main’:
src/shell.c:18:18: warning: implicit declaration of function ‘getline’ [-Wimplicit-function-declaration]
18 | bytes_read = getline(&user_input, &input_buffer_size, stdin);
| ^~~~~~~发布于 2021-01-31 22:15:03
看来编写教程的人在测试代码时并没有提供任何特殊的编译选项。在该页面上,我只看到一个编译命令,它是gcc -o main main.c。因此,他们得到了GCC的缺省值,这通常会使getline在拥有它的计算机上可用。
但是,在编译代码时使用了编译器标志-std=c11。此标志的影响之一是GCC指示C库的标头只声明,即 C2011指定的函数、常量、变量等。(取决于您使用的是哪个C库,这个指令可能有效果,也可能没有效果--但是Ubuntu使用了GNU库,它彻底实现了它。) getline不是ISO C2011的一部分,所以没有声明它,当您尝试使用它时,您会得到“隐式声明”诊断。
使用超整合的-std=cXX 模式几乎总是一个错误。和-std=gnuXX有三个不同之处,在实践中没有一个是可取的:
linux、unix、arm)。这在抽象上是可取的,但就像#1一样,有一种严重的倾向,就是打破在这种模式下很少被测试的库头。要用相当挑剔的一致性诊断级别来编译您自己的代码,而不是冒着破坏库头的风险,有更好的选项组合:
cc -std=gnuXX -g -Og -Wall -Wextra -Wpedantic -Wstrict-prototypes -Wwrite-strings(选择一个合适的XX;如果你没有其他选择的理由,我会选择11。)您可能希望或不希望为其中一个-D 特征选择宏添加一个_xxx_SOURCE开关;解释这些开关是如何工作的以及如何选择其中一个,这本身就是一个完整的问题。
https://stackoverflow.com/questions/65958494
复制相似问题