error: conflicting types for xxx in c
阿新 • • 發佈:2022-05-28
一、問題描述
#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
是如何引入的並不瞭解,這是需要深入挖掘的地方。
歡迎搜尋及關注:程式設計人