C冲突类型错误

时间:2015-11-30 22:32:46

标签: c

当我尝试编译这个时,我被gcc告知我pack_cui(C)的类型有冲突。

我不知道我是如何得到冲突类型的,因为我知道我传递了char*。我是C的新手,所以我确定我错过了一些明显的东西。

int main(){
  char* C = malloc(sizeof(char) * 4);
  C[0] = 1;
  C[1] = 2;
  C[2] = -1;
  C[3] = 4;
  pack_cui(C);
  return 0;
}

unsigned int pack_cui(char* C){
  unsigned int new_int = 0;
  unsigned int i;
  for(i = 0; i < 4; i++){
    new_int = new_int | (unsigned int)(signed int)C[i];
    if(i != 3) new_int = new_int << 8;
  }
  return new_int;
}

我收到的错误是

hw12.c:17:14: error: conflicting types for ‘pack_cui’
 unsigned int pack_cui(char* C){
              ^
hw12.c:13:5: note: previous implicit declaration of ‘pack_cui’ was here
     pack_cui(C);

4 个答案:

答案 0 :(得分:2)

pack_cui之前为main添加原型:

unsigned int pack_cui(char* C);

否则,当编译器看到对pack_cui的调用时,它必须猜测类型,在这种情况下它猜错了。

答案 1 :(得分:2)

当您调用未声明的函数时,C89标准要求隐式声明。该声明将是:

int pack_cui();

()(void)不同,它表示该函数采用未指定的个参数,而(void)表示零。这是在ISO和ANSI C之后,在K&amp; R天回来的。

你不希望这样,因为这是错误的声明。在main()上方的顶部创建您自己的声明:

unsigned pack_cui(char *);

答案 2 :(得分:1)

pack_cui的定义从main函数下方移至main函数上方。或者设置并包含一个声明pack_cui的头文件。

此外,完成此操作后,重新编译并启用警告,以便您捕获代码中的其他问题:

$ gcc -Wall foo.c

至少应包括stdlib.h

答案 3 :(得分:1)

当您调用C函数时,无论它是您自己的还是标准库声明的函数,您必须具有该函数的可见声明,以便编译器知道如何生成调用它的代码。该声明应该是原型,即声明指定函数参数的类型。函数定义(包含实现该函数的代码的{ ... })提供了一个声明。

在您的示例中,在通话时未显示pack_cui的声明;它直到稍后才定义。

您可以通过添加&#34;转发声明&#34;将pack_cui的定义移到main的定义之上来解决此问题。并将定义留在原来的位置。

后者看起来像这样:

unsigned int pack_cui(char* C);   /* a declaration, not a definition */

int main(void) {                  /* definition of main */
    /* ... */
}

unsigned int pack_cui(char* C) {  /* definition of pack_cui */
    /* ... */
}

任何一种方法都可以接受。

出于同样的原因,您需要为malloc函数提供声明。你应该通过添加

来做到这一点
#include <stdlib.h>

到源文件的顶部。