当我尝试编译这个时,我被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);
答案 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>
到源文件的顶部。