2013-10-02 43 views
-1

我从Brian Kernighan和Dennis Ritchie编写的“The C Programming Language”获得以下代码。无法获得ANSI 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; 
    } 

我得到的是:: 错误:但是,它不会用gcc编译。预计标识符或 '(' 前 '{'

我在做什么错

+0

int getline(char * line,int max)',只是删除';',它会起作用 –

+1

** **是**错误吗? *(错误信息是指特定的代码行,这将有助于缩小问题范围到代码中的特定位置)* – abelenky

+0

*开始摆脱; after - getline(char * line,int max) –

回答

0
int getline(char *line, int max); // <-- Delete that semi-colon 
{ 
+0

好的,我删除了它。现在我得到这个: 刺痛。c:在函数'getline'中: sting.c:8:错误:'行'重新声明为不同种类的符号 sting.c:5:注意:'行'的先前定义在这里 sting.c:11:错误:'argc'未声明(首次在此函数中使用) sting.c:11:错误:(每个未声明的标识符只报告一次 sting.c:11:错误:对于它显示的每个函数。) sting。 c:15:error:'argv'undeclared(在这个函数中首次使用) – Tensigh

+0

我直接从书中输入了这个,所以我只是好奇ANSI C和GCC编译它有什么不同。 – Tensigh

+0

您输入的代码根本没有多少意义。请确认您是从书中正确输入的。特别是:你缺少main的声明,它应该是这样的:'int main(int argc,char ** argv)',你缺少一个函数体(很难判断你是否缺少'getline ''或'main',但肯定缺少了一些东西!) – abelenky

0

删除分号:

int getline(char *line, int max)

1

删除;

int getline(char *line, int max); 
           ^
           | 
          remove this semicolon 
2

由于this answer说,你省略了声明main功能就行了。

这条线:

int getline(char *line, int max); 

声明getline功能的,其必须被定义别处。 (如果你放弃了;,它也可能是一个完整的定义getline的第一线,但似乎并没有被意图。)

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

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

当然,您需要在某处定义getlineget_line函数。 (如果你喜欢,你可以把定义放在同一个源文件中,但我怀疑这个练习的重点是从多个源文件中构建程序。)

+0

我明白了。这不是原来的代码,所以我认为它可能是stdio.h的一部分,但显然不是。 – Tensigh