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

时间:2017-09-22 19:09:04

标签: c function memory compiler-errors

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

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

5 个答案:

答案 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;
}