1. 程式人生 > 其它 >error: conflicting types for xxx in c

error: conflicting types for xxx in c

一、問題描述

#include <stdio.h>

#define MAXLINE 1000

/* maximum input line length */
int getline(char lines[], int maxline);
void copy(char to[], char from[]);

int main(void)
{
    int len;  // current line length
    int max;  // maximum lenght seen so far
    char line[MAXLINE]; // current input line
    char longest[MAXLINE]; // longest line

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if ( len > max) {
          max = len;
          copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);

    return 0

}

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;
    }

    return i;
}


void copy(char to[], char from[])
{
    int i;

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

執行以上程式碼的時候出現錯誤提示:error: conflicting types for 'getline'; have 'int(char *, int)'。程式碼來源於《C Programming Language》。

二、問題分析

這段程式碼來自於 《C Programming Language》這本經典的書,按理說不應該有問題,要有問題的話往往可能是因為時間久遠,C語言發生了變化。

根據提示 conflicting types —— conflicting: are different and apposing ,對於 getline() 函式,應該是它的 type 在某兩個地方(函式宣告&函式定義)不一樣,可能是函式的引數型別

不一樣,也有可能是函式的返回型別不一樣。

我們先來看下函式宣告:

int getline(char lines[], int maxline);

再來看下函式定義:

int getline(char s[], int lim)

奇怪,函式的引數型別和函式的返回型別都一樣啊,為什麼還會提示錯誤呢?既然這個兩個地方沒有問題,那麼就剩下函式名了,這裡應該有問題。那就換一個名字吧,比如改成 getaline

#include <stdio.h>

#define MAXLINE 1000

/* maximum input line length */
int getaline(char lines[], int maxline);
void copy(char to[], char from[]);

int main(void)
{
    int len;  // current line length
    int max;  // maximum lenght seen so far
    char line[MAXLINE]; // current input line
    char longest[MAXLINE]; // longest line

    max = 0;
    while ((len = getaline(line, MAXLINE)) > 0)
        if ( len > max) {
          max = len;
          copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);

    return 0;

}

int getaline(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;
    }

    return i;
}

void copy(char to[], char from[])
{
    int i;

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

這樣一改,還真可以了。但是好像還是沒有解釋為什麼 getline()這個函式名被佔用了呢?根據 資料getline()a GNU extension,因為本文著重於講解如何從提示去分析問題,所以對於 getline() 函式如何造成這種衝突的不展開講解。

三、解決方法

將函式名 getline修改成其它名字, 比如改成 getaline

四、總結

這個問題之所以給我造成困擾,在於問題的原因表現得並不是那麼直接——並不能直接從原始碼看出來,同時也反映了我對 getline是如何引入的並不瞭解,這是需要深入挖掘的地方。

歡迎搜尋及關注:程式設計人