我是C的新手并编写了以下返回char的代码。
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
char test(){
char c = 'z';
return 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();
^
有什么想法吗?这需要内存分配吗?如果是这样,为什么?
答案 0 :(得分:3)
这是因为你要么必须在main上面定义函数原型,要么将函数移到main上面。
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);
}
答案 1 :(得分:0)
您在宣布之前呼叫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;
}
答案 2 :(得分:0)
当您在test()
中调用main()
函数时,您尚未提供char test(void);
函数的原型。您可以在源文件的顶部执行test()
(或者更常见地在头文件中执行此操作)。
其他选项是将main()
的定义移到 error: conflicting types for ‘test’
函数之上,以确保定义本身提供原型。
错误原因:
int
是在C99之前的C中,编译器隐式地为test()
提供test()
返回原型(称为隐式int规则),它与{的实际定义冲突{1}}(实际上它有char
作为返回类型)。请注意,这不再有效(在C99及更高版本中)。
答案 3 :(得分:0)
在C中编译器启动"读取"代码从上到下,所以当你的主函数试图找出什么是test()时,它还不知道这个函数。 要解决它,你可以把你的主函数放在test()函数之后,或者使用函数原型,这是更好的代码实践,manly用于将来的代码读取。像这样:
char test();
int main(int argc, char * argv[]){
char c = test();
printf("num = %c \n", c);
}
char test(){
char c = 'z';
return c;
}
答案 4 :(得分:0)
在此声明中使用名称test
之前
char c = test();
必须声明。
这条消息
read.c:8:1: warning: data definition has no type or storage class [enabled by default]
test();
^
表示编译器不知道变量test()
声明中使用的表达式c
的类型作为初始值。
为了与旧版本的C Standard兼容,编译器假定该函数具有返回类型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;
}