无法使用 gcc 编译 ANSI C 代码

标签 c gcc ansi-c

我从 Brian Kernighan 和 Dennis Ritchie 编写的《C 编程语言》中得到了以下代码。但是,它不能用 gcc 编译:

#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int getline(char *line, int max);

{
 char line[MAXLINE];
 int found = 0;

 if (argc != 2)
  printf("Usage: find pattern\n");
 else
  while (getline(line, MAXLINE) > 0)
   if (strstr(line, argv[1])  != NULL) {
      printf("%s", line);
      found++;
   }
  return found;
}

我得到的只是: 错误:“{”之前应有标识符或“(”。

我做错了什么?

最佳答案

this answer说,您省略了声明 main 函数的行。

这一行:

int getline(char *line, int max);

getline 函数的声明,必须在其他地方定义。 (如果您删除了 ;,它也可能是 getline 的完整定义的第一行,但这似乎不是意图。)

在这种情况下,其意图似乎是在不同的源文件中定义它。您需要编译该源文件和这个源文件,然后使用链接器将它们组合成一个可执行程序。

不过,您可能会遇到另一个问题。某些实现提供了自己的非标准函数,称为 getline,并且它与您声明它的方式不兼容。如果您使用的是 gcc,则需要使用禁止该非标准定义的选项进行编译,例如 -ansi-std=c99。为简单起见,您可以考虑使用 getline 以外的名称; get_line 应该没问题。

当然,您需要在某处定义 getlineget_line 函数。 (如果您愿意,可以将定义放在同一个源文件中,但我怀疑此练习的目的是从多个源文件构建程序。)

关于无法使用 gcc 编译 ANSI C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139956/

相关文章:

c++ - 无法在 keil c 项目中添加 C++ 库

代码覆盖率——哪次运行覆盖了哪些代码?

gcc - boost::program_options 给出 malloc 错误

在 ANSI C 的控制流语句中组合比较测试

c - C89 关于两个负数 : round up, 向下舍入或未定义的整数除法的行为是什么?

runtime-error - 地址 sanitizer : heap-use-after-free ANSI C

c - long long integer 在 C(UNIX+AIX6.1) 中不起作用

c - DWARF - 如何在给定的二进制文件中找到函数的序言结束/结尾开始地址?

c - 两个随机数组

c++ - 如何将 c/c++ 应用程序移植到旧版 linux 内核版本