首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个代码中抛出函数‘getline’警告的隐式声明,而不是在另一个代码中抛出的警告。

在一个代码中抛出函数‘getline’警告的隐式声明,而不是在另一个代码中抛出的警告。
EN

Stack Overflow用户
提问于 2021-01-29 16:45:24
回答 1查看 896关注 0票数 2

这个问题不是如何删除警告

我在写贝壳。我提到了这个来源。在我的代码中,我使用了与他相同的标题(按相同的顺序)。

在编译他的代码时,我不会收到任何关于隐式声明 of getline的警告。但是当我编译我的时,它确实会被抛出。

手册页建议使用#define _GNU_SOURCE,并添加了从我的代码中删除警告。

那么,为什么在博客中没有为代码抛出警告,因为他没有使用#define _GNU_SOURCE

下面是最低限度的代码(我复制了上面提到的所有标头)

代码语言:javascript
复制
// #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;
}

这是我使用的编译过程..。

代码语言:javascript
复制
gcc -std=c11 -o bin/shell src/shell.c

这是如果我保留第一行注释的话会出现的错误。

代码语言:javascript
复制
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);
      |                  ^~~~~~~
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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有三个不同之处,在实践中没有一个是可取的:

  1. 正如上面所讨论的,它指示标头不要声明任何不属于ISO C的特定修订版的内容,正如您自己看到的,在编写一个非平凡的C程序时,这几乎从来都不是您想要的。它还有一个坏的倾向,就是打破库头--包括第三方头和C库自己的头--因为它们很少在这种模式下进行测试。
  2. 它禁用污染用户名称空间的"特定于系统的预定义宏“(例如linuxunixarm)。这在抽象上是可取的,但就像#1一样,有一种严重的倾向,就是打破在这种模式下很少被测试的库头。
  3. 它支持三角图,这是一个使C使用缺少标点符号的ASCII的“国家变体”的传说。这些都是很少使用,并造成如此多的实际混乱,他们实际上被从C++ 2017年(但不是C 2017年)。

要用相当挑剔的一致性诊断级别来编译您自己的代码,而不是冒着破坏库头的风险,有更好的选项组合:

代码语言:javascript
复制
cc -std=gnuXX -g -Og -Wall -Wextra -Wpedantic -Wstrict-prototypes -Wwrite-strings

(选择一个合适的XX;如果你没有其他选择的理由,我会选择11。)您可能希望或不希望为其中一个-D 特征选择宏添加一个_xxx_SOURCE开关;解释这些开关是如何工作的以及如何选择其中一个,这本身就是一个完整的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65958494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档