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
到源文件的顶部。