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是如何引入的并不了解,這是需要深入挖掘的地方。
歡迎搜索及關注:編程人
浙公網安備 33010602011771號