2016-06-22 14 views
2

矛盾メソッド定義C.本は絶対に素晴らしいです。しかし、29ページ(1.9文字配列)で提供したプログラムはコンパイルされません。これは私が(それは私がそれを呼んだものだ)cc longest_line.cを実行すると、私はそれがすでにstdio.hで定義されたようgetlineは定義が矛盾しているというエラーが出るコードK&Rエラー:私は私のプログラミングを支援するために、低レベルの言語の基礎を取得しようとしてきたとしても、私が知りたいので、Cを学ぶためにK & R(2編)を通じてつもりです

#include <stdio.h> 
#define MAXLINE 1000 /* maximum input line size */ 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

/* print longest input line */ 
main() 
{ 
    int len;   /* current line length */ 
    int max;   /* maximum length seen so far */ 
    char line[MAXLINE];  /* current input line */ 
    char longest[MAXLINE]; /* longest line saved here */ 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) 
     if (len > max) { 
      max = len; 
      copy(longest, line); 
     } 
    if (max > 0) /* there was a line */ 
     printf("%s", longest); 
    return 0; 
} 

/* getline: read a line int s, return length */ 
int getline(char s[], int lim) 
{ 
    int c, i; 

    for (i = 0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
     s[i] = c; 
    if (c == '\n') { 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

/* copy: copy 'from' into 'to'; assume to is big enough */ 
void copy(char to[], char from[]) 
{ 
    int i; 

    i = 0; 
    while ((to[i] = from[i]) != '\0') 
     ++i; 
} 

です。私の質問は、どうすれば解決できますか/ getlineに別の名前をつけなくても解決できますか?

+2

は、[これは 'getline'](HTTP:/

だけでPOSIXライブラリとの衝突を防ぐために、ANSIモードでコンパイル/man7.org/linux/man-pages/man3/getline.3.html)のように ''で宣言されています。あなたの問題については、関数の名前を変更する以外の解決策はありません。同じ名前の2つのシンボルと2つの異なる宣言を持つことはできません。 –

+3

オペレーティングシステムをPOSIX以外のフレーバーに変更することも、機能の名前を変更することもできます。そのうちの1つが最速です。 –

+1

1)Cが_methods_をサポートしていない、唯一_functions_ 2)K&Rは、C言語の旧式、非標準に準拠したバージョンを教示しています。最近の本を使用してください。 – Olaf

答えて

2

@Olafがコメントしたように、あなたのコードが渡されます。その場合にはあなたの知識なしに変更または受け取ることができるので、これは非常に悪い考えで、getline()が標準ですPOSIX、

K & R第二版は、ANSI 89標準です。

gcc -ansi source.c 

編集: あなたの参考のためGodBot Link

+0

'-ansi'フラグでも同じエラーが表示されます。 –

+0

あなたのツールチェーンは何ですか、コードは(x86 gcc)でコンパイルされ、4.8から6.1の複数のgccバージョンをテストしました – xvan

+0

gcc:4.2.1とLLVM:7.3.0 –

-2

このアプローチでは、問題のあるヘッダを含めないことで、あなたの問題を回避します。むしろ、実装でローカルに必要なすべての宣言をローカルにコピーします。
これらの関数の宣言が悪い入力

#define MAXLINE 1000 /* maximum input line size */ 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 
int printf(const char *format, ...); 
int getchar(void); 

/* print longest input line */ 
int main() 
{ 
    int len;   /* current line length */ 
    int max;   /* maximum length seen so far */ 
    char line[MAXLINE];  /* current input line */ 
    char longest[MAXLINE]; /* longest line saved here */ 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) 
     if (len > max) { 
      max = len; 
      copy(longest, line); 
     } 
    if (max > 0) /* there was a line */ 
     printf("%s", longest); 
    return 0; 
} 

/* getline: read a line int s, return length */ 
int getline(char s[], int lim) 
{ 
    int c, i; 

    for (i = 0; i<lim-1 && (c=getchar())!=-1 && c!='\n'; ++i) 
     s[i] = c; 
    if (c == '\n') { 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

/* copy: copy 'from' into 'to'; assume to is big enough */ 
void copy(char to[], char from[]) 
{ 
    int i; 

    i = 0; 
    while ((to[i] = from[i]) != '\0') 
     ++i; 
} 

+1

OPは 'getline'の名前を変更することを避けることができるかどうかを知りたがっています。 –

+0

私はそれを知っています。私は 'getline'の定義を保持でき、' stdio.h'の定義を何とかオーバーライドできるかどうかを尋ねていました。 –

+0

ええ、申し訳ありません、更新された回答 –