2017-09-22 127 views
1

我是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; 
} 

但是编译时,我得到了下面的错误?这是否需要内存分配?如果是这样,为什么?

+2

始终把你的主(...)函数在C文件的底部,否则你需要在文件顶部添加函数原型。 – cleblanc

回答

2

这是因为你要么定义主函数的原型,要么将函数移到主函数之上。

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); 
} 
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; 
} 
0

你还没有被你调用它main()时提供一个原型test()功能。您可以在源文件的顶部执行char test(void);(或更传统地在头文件中)。

其他选项是移动test()以上的定义main()函数将确保定义本身提供原型。

的原因的错误:

error: conflicting types for ‘test’ 

的是,在预C99 C,编译器隐式地提供一个int返回原型test()(称为隐式int规则),其与实际的定义有冲突test()(它实际上有char作为返回类型)。请注意,这不再有效(在C99及更高版本中)。

0

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

在此声明

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