error: conflicting types for xxx in c

本文解析了一个关于C语言中getline函数的类型冲突错误,并通过更改函数名称解决了问题。

一、问题描述

#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是如何引入的并不了解,这是需要深入挖掘的地方。

欢迎搜索及关注:编程人

In file included from data/../srvcMacsec.h:23:0, from data/rtdMacsec.h:43, from swMacsec.h:22, from mainMacsec.c:37: ../../../../../../src/application/include/macsec/macsecPub.h:144:2: error: conflicting types for 'MKA_POLICY_CONFIG_STRUCT' }MKA_POLICY_CONFIG_STRUCT; ^ In file included from swMacsec.h:19:0, from mainMacsec.c:37: data/ucMacsec.h:82:2: note: previous declaration of 'MKA_POLICY_CONFIG_STRUCT' was here }MKA_POLICY_CONFIG_STRUCT; ^ CMakeFiles/macsec.dir/build.make:91: recipe for target 'CMakeFiles/macsec.dir/mainMacsec.c.o' failed make[4]: *** [CMakeFiles/macsec.dir/mainMacsec.c.o] Error 1 make[4]: *** Waiting for unfinished jobs.... In file included from srvcMacsec.h:23:0, from macsecKeyUtils.c:24: ../../../../../../src/application/include/macsec/macsecPub.h:144:2: error: conflicting types for 'MKA_POLICY_CONFIG_STRUCT' }MKA_POLICY_CONFIG_STRUCT; ^ In file included from srvcMacsec.h:22:0, from macsecKeyUtils.c:24: data/ucMacsec.h:82:2: note: previous declaration of 'MKA_POLICY_CONFIG_STRUCT' was here }MKA_POLICY_CONFIG_STRUCT; ^ CMakeFiles/macsec.dir/build.make:78: recipe for target 'CMakeFiles/macsec.dir/macsecKeyUtils.c.o' failed make[4]: *** [CMakeFiles/macsec.dir/macsecKeyUtils.c.o] Error 1 In file included from swMacsec.h:19:0, from opMacsec.c:59: data/ucMacsec.h:82:2: error: conflicting types for 'MKA_POLICY_CONFIG_STRUCT' }MKA_POLICY_CONFIG_STRUCT; ^ In file included from opMacsec.c:51:0: ../../../../../../src/application/include/macsec/macsecPub.h:144:2: note: previous declaration of 'MKA_POLICY_CONFIG_STRUCT' was here }MKA_POLICY_CONFIG_STRUCT; ^ 说明错误
最新发布
12-18
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值