1. ホーム
  2. c

[解決済み] 以前の 'function' の宣言は C のここ [重複] であった。

2022-01-29 02:21:29

質問

<ブロッククオート

重複の可能性があります。
K&Rで学ぶC言語、書籍の配列や関数呼び出しのあるプログラムをコンパイルしようとするとエラーが発生する。

Brian W. Kernighan と Dennis M. Ritchie 著の The C Programming Language を学習中、1.9 Character Arrays のセクションの例を試しました。以下はそのコードである。

/* read a set of text lines and print the longest */

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

/* declare functions: getline() and copy() */
int getline(char line[], int maxline); 
void copy(char to[], char from[]);

/* getline: read a line into array "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';  /* the null character whose value is 0 */
    return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */ 
/* the return type of copy is "void" -- no value is returned */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')  /* terminated with a \0 */
        ++i; 
}

/* print the 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; 
}

エラーは主に2つあります。

  1. error: 'getline' の型が競合しています。
  2. error: 'getline' の前の宣言はここです。

完全なエラーリストはこちらです。

/Users/C/Codes/Ritchie/array_char.c:8: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c:13: error: conflicting types for ‘getline’
/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
/Users/C/Codes/Ritchie/array_char.c: In function ‘getline’:
/Users//C/Codes/Ritchie/array_char.c:17: warning: comparison between pointer and integer
/Users/C/Codes/Ritchie/array_char.c:17: warning: comparison with string literal results in unspecified behavior

本に載っているコードと全く同じなので、何がいけなかったのかよくわかりません。たぶん、冒頭の関数の宣言でしょう。

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

は問題ないでしょうか?ありがとうございました。

解決方法は?

http://www.kernel.org/doc/man-pages/online/pages/man3/getline.3.html

getlineはstdio.hにすでに存在しているため、エラーが発生します。関数名をgetline_myのような他の名前に変更してください。

また、16行目では文字と文字列を比較していますね。これは
if(c == '\n')

NOT

if(c == "\n")