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
是如何引入的并不了解,这是需要深入挖掘的地方。
欢迎搜索及关注:编程人
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比