繁体   English   中英

C返回char的函数给出了冲突类型错误

[英]C Function to return char gives conflicting types error

我是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();
 ^

有任何想法吗? 这需要内存分配吗? 如果是这样,为什么?

这是因为你要么必须在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);
}

您在声明之前调用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中,编译器隐式地为test()提供了一个int返回原型(称为隐式int规则 ),它与test()的实际定义冲突(其中它实际上有char作为返回类型)。 请注意,这不再有效(在C99及更高版本中)。

在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;
}

在此声明中使用名称test之前

char c = 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM