C函数返回字符给出冲突类型的错误
问题描述:
我是C新手,并且写下面的代码返回一个字符。C函数返回字符给出冲突类型的错误
read.c:8:1: warning: data definition has no type or storage class [enabled by default]
test();
^
read.c:71:6: error: conflicting types for ‘test’
char test(){
^
read.c:8:1: note: previous declaration of ‘test’ was here
test();
^
任何想法:
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
char test(){
char c = 'z';
return c;
}
但是编译时,我得到了下面的错误?这是否需要内存分配?如果是这样,为什么?
答
这是因为你要么定义主函数的原型,要么将函数移到主函数之上。
char test();
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
char test(){
char c = 'z';
return c;
}
或
char test(){
char c = 'z';
return c;
}
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
答
要调用test
它的声明之前。无论是main
函数之前声明它,或提供其原型:
/* Prototype of test */
char test();
int main(int argc, char * argv[]) {
char c = test();
printf("num = %c \n", c);
}
char test() {
char c = 'z';
return c;
}
答
你还没有被你调用它main()
时提供一个原型test()
功能。您可以在源文件的顶部执行char test(void);
(或更传统地在头文件中)。
其他选项是移动test()
以上的定义main()
函数将确保定义本身提供原型。
的原因的错误:
error: conflicting types for ‘test’
的是,在预C99 C,编译器隐式地提供一个int
返回原型test()
(称为隐式int规则),其与实际的定义有冲突test()
(它实际上有char
作为返回类型)。请注意,这不再有效(在C99及更高版本中)。
答
在C语言中,编译器开始从顶部到底部“读取”代码,所以当它在你的主函数上试图找出什么是test()时,它还不知道这个函数。 为了解决这个问题,你可以在test()函数之后放置你的主要函数,或者使用函数原型,这是更好的代码实践,有助于未来的代码读取。就像这样:
char test();
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
char test(){
char c = 'z';
return c;
}
答
在此声明
char c = test();
,它必须声明使用的名称test
之前。
而这个消息
read.c:8:1: warning: data definition has no type or storage class [enabled by default]
test();
^
说,编译器不知道在可变c
的声明作为初始化用的表达test()
的类型。
为了与旧版本的C标准兼容,编译器假定该函数的返回类型为int
。然而,它遇到该函数返回类型char
。而这些编译器的消息说这个
read.c:71:6: error: conflicting types for ‘test’
char test(){
^
read.c:8:1: note: previous declaration of ‘test’ was here
test();
^
因此,使用该功能之前,你必须
char test(void);
注重声明它的函数的参数main
int main(int argc, char * argv[]){
不用过的。所以功能main
可以声明如下
int main(void){
所以该程序可以像
#include <stdio.h>
char test(void);
int main(void)
{
char c = test();
printf("num = %c\n", c);
return 0;
}
char test(void)
{
char c = 'z';
return c;
}
始终把你的主(...)函数在C文件的底部,否则你需要在文件顶部添加函数原型。 – cleblanc