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); 

main之前为pack_cui添加原型:

 unsigned int pack_cui(char* C); 

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

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

 int pack_cui(); 

()(void) ,它表示函数采用未指定数量的参数,而(void)表示零。 这是从ISO / ANSI C之前的K&R时代遗留下来的。

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

 unsigned pack_cui(char *); 

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

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

 $ gcc -Wall foo.c 

你应该至少包括stdlib.h

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

在您的示例中,在调用时没有可见的pack_cui声明; 它直到后来才定义。

您可以通过将pack_cui的定义pack_cui的定义之上, 或者通过添加“forward声明”并将定义保留在它们所在的位置来解决此问题。

后者看起来像这样:

 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  

到源文件的顶部。