【问题标题】:conflicting types for an function函数的冲突类型
【发布时间】:2019-08-23 15:34:35
【问题描述】:

下面的代码是颠倒字符串中单词的顺序。 但我收到反向函数的“冲突类型”错误。

我对编译器给出的错误感到困惑 'expected 'struct word *' but argument is of type 'struct word *'.

我已经在main函数之前声明了rev函数。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* rev(char*,struct word*);
int countWord(char*);

struct word{
    char word[20];
};

int main(){

    char str[100];
    char* strp = str;
    char result[100];
    printf("\nEnter string: ");
    fgets(strp,100,stdin);

    int noWords = countWord(strp);

    struct word *ptr; 
    ptr = (struct word*)calloc(noWords,sizeof(struct word));
    

    strcpy(result,rev(strp,ptr));
    printf("reverse is: %s",result);

    return 0;
}

int countWord(char* str){

    int count=0;
    char str1[100];
    strcpy(str1,str);
    int i=0;
    while(str1[i]!='\0'){
        if(str1[i]==' ' && str1[i+1]!=' '){
            count++;
        }
    }
    count+=1;
    return count;
}

char* rev(char* strp,struct word *ptr){

    char str[100];
    strcpy(str,strp);
    char temp[20];
    int i=0,j=0,k=0,l=0;

    while(str[i]!='\0'){
        j=0;
        while(str[i]!=' ' && str[i]!='\0'){
            temp[j]=str[i];
            i++;j++;
        }
        if(str[i]==' ')
            i++;
        temp[j]='\0';

        strcpy(ptr[k].word,temp);
        k++;
    }

    char* ret = (char*)malloc(strlen(str)+1);
    //ret[l]='\0';
    k--;

    while(k){
        strcat(ret,ptr[k].word);
        strcat(ret," ");
        k--;
    }

    return (char*)ret;
}

预期结果是单词顺序相反的字符串。

Errors and warnings by compiler-
wordRev.c:5:24: warning: ‘struct word’ declared inside parameter list will not be visible outside of this definition or declaration
 char* rev(char*,struct word*);
                        ^~~~
wordRev.c: In function ‘main’:
wordRev.c:26:25: warning: passing argument 2 of ‘rev’ from incompatible pointer type [-Wincompatible-pointer-types]
  strcpy(result,rev(strp,ptr));
                         ^~~
wordRev.c:5:7: note: expected ‘struct word *’ but argument is of type ‘struct word *’
 char* rev(char*,struct word*);
       ^~~
wordRev.c: At top level:
wordRev.c:47:7: error: conflicting types for ‘rev’
 char* rev(char* strp,struct word *ptr){
       ^~~
wordRev.c:5:7: note: previous declaration of ‘rev’ was here
 char* rev(char*,struct word*);

【问题讨论】:

  • 在声明函数原型时,是否定义了结构word?订单很重要!
  • @vikas damdhare 在与 C++ 相对的 C 中,没有详细的名称声明。该结构应在函数参数列表中使用之前声明。

标签: c struct memo


【解决方案1】:

你应该做的是将struct word的声明移到rev的声明之前,这样就可以解决。

我想指出的是为什么你会得到那个模糊的错误,这很难理解:

expected ‘struct word *’ but argument is of type ‘struct word *’

认为编译器从上到下扫描源文件。

它遇到的第一件事是函数rev原型,它使用了一些未知的结构struct word。问题在于它不是结构本身,而是指向结构的不透明指针。

在 C 中,使用指向以前从未声明过的某种类型的指针是合法的(尽管这是一种不好的做法,并且您会收到警告),只要它只是一个指针并且您从不取消引用它。

您看,从编译器的角度来看,任何指针都只是 64(或其他)位数,仅此而已。指针实际指向什么并不重要。只要您不尝试取消引用它(访问指针指向的值) - 编译器并不真正关心它指向的数据类型。

编译器所做的是制作一些临时类型struct word *,它只能在函数 rev 中使用。 rev 可能是来自外部库的函数,或者它对这种类型结构有一些其他了解,例如它是序列化数据 - 在这种情况下这更有意义,但不是你的情况。

接下来,编译继续,遇到struct word定义。现在定义了这个结构,但是从编译器的角度来看,它与函数rev中定义的临时类型不同。

接下来你调用rev,但正如所说,从编译器的角度来看,它的参数struct word * 与你传递给它的struct word * 类型不同,因此出现了这个奇怪的错误。

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多