2012-04-13 21 views
-1

我是c語言的新手。所以,我從Brian Kernighan和Dennis Ritchie的書(The C programming language)中複製了代碼。我正在複製pg32的例子。當我得到這個錯誤:C程序 - 錯誤:與'char line []'[-fpermissive]'之前的外部decl類型不匹配

pg32.c: In function ‘int main()’: 
pg32.c:16:23: error: type mismatch with previous external decl of ‘char longest []’ [-fpermissive] 
pg32.c:7:6: error: previous external decl of ‘char longest [1000]’ [-fpermissive] 
pg32.c: In function ‘int getl()’: 
pg32.c:33:20: error: type mismatch with previous external decl of ‘char line []’ [-fpermissive] 
pg32.c:6:6: error: previous external decl of ‘char line [1000]’ [-fpermissive] 
pg32.c: In function ‘void copy()’: 
pg32.c:50:20: error: type mismatch with previous external decl of ‘char line []’ [-fpermissive] 
pg32.c:6:6: error: previous external decl of ‘char line [1000]’ [-fpermissive] 
pg32.c:50:31: error: type mismatch with previous external decl of ‘char longest []’ [-fpermissive] 
pg32.c:7:6: error: previous external decl of ‘char longest [1000]’ [-fpermissive] 

我重新輸入代碼4次,同樣的錯誤。我不確定,但我認爲這是一個遺留問題。

#include<stdio.h> 

#define MAXLINE 1000 

int max; 
char line[MAXLINE]; 
char longest[MAXLINE]; 

int getl(void); 
void copy(void); 

int main() 
{ 
    int len; 
    extern int max; 
    extern char longest[]; 

    max =0; 
    while((len =getl()) > 0) 
    if(len > max){ 
     max = len; 
    copy(); 
    } 

    if(max > 0) 
    printf("%s", longest); 
    return 0; 
} 

int getl(void) 
{ 
    int c, i; 
    extern char line[]; 

    for(i =0; i < MAXLINE-1 && 
    (c=getchar()) != EOF && c != '\n'; ++i) 
    line[i] =c; 

    if(c=='\n'){ 
    line[i] = c; 
    ++i; 
    } 
    line[i] ='\0'; 
    return i; 
} 

void copy(void) 
{ 
    int i; 
    extern char line[], longest[]; 

    i=0; 
    while((longest[i] = line[i]) != '\0') 
    ++i; 
} 

我很感激任何幫助。

+0

你使用什麼編譯器?這[編譯](http://ideone.com/7k1Vw)與gcc-4.3.4 – 2012-04-13 02:47:10

+0

gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu4) – agape 2012-04-13 02:58:48

回答

2

將「行」和「最長」作爲全局變量在文件頂部聲明爲固定長度數組。然後你將它們重新聲明爲extern(不需要這樣做)作爲不確定長度的數組。編譯器不喜歡這一點,所以有2個解決方案:

  1. 改變每extern line[]extern line[MAXLINES]extern char longest[]extern char longest[MAXLINES]
  2. 刪除所有extern聲明,只是使用全局頂部
+0

哇,選項1工作。 – agape 2012-04-13 02:57:53

+0

兩者都應該工作。如果它在這樣的文件中(實際聲明和extern聲明),我認爲選項二實際上更可取。 – 2012-04-13 03:09:56

+0

選項2在數組大小方面確實存在錯誤。但是謝謝你的選擇1。 – agape 2012-04-13 04:33:10