答题看女女 c
#include <stdio.h>void main()
{
int c={1,3,2,4,5,6,7,5,4,5};
int i;
for(i=0; i<10; i++){
test(c); =============我要疯了
}
printf("\n");
}
void test(int v)
{
if(v>0){
printf("%d",v);
}
else{
printf("%d",0);
}
}
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(8) : warning C4013: 'test' undefined; assuming extern returning int
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(14) : error C2371: 'test' : redefinition; different basic types
执行 cl.exe 时出错. 本帖最后由 零度非安全 于 2015-7-31 12:54 编辑
主函数中的text(c[])里的参数是数组类型,而你另外定义的text函数里的参数而是int v,应该是int v[]
还有的就是必须要有返回值
定义的函数也没有声明
以下是我根据你的意思我改编的,仅供参考!
#include <stdio.h>
int test(int v[]);
void main()
{
int c = { 1,3,2,4,5,6,7,5,4,5 };
test(c);
printf("\n");
}
int test(int v[])
{
int i;
for (i = 0; i < 10; i++){
if (v>0) printf("%d", v);
else printf("%d", 0);
}
return v;
}
我的是用VS2015在win10环境下测试的,见下图
函数前置申明
在main函数上面加上 void test(int v); 不疯才怪。。。开始我也没看出来
在主函数之前做函数的声明 void text(int v) 或者把定义的text函数放到主函数的上面!! 路过打下酱油 好吧,我觉得知道怎么改没什么了不起的。关键在于如何分析编译器的警告和报错。
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(8) : warning C4013: 'test' undefined; assuming extern returning int
其中,over.c(8) : warning C4013: 'test' undefined大概是说文件over.c的第8行,test没有定义。也就是你程序中的 函数调用test(c);
分析下,如果从前往后读,读到这里,确实还没读到函数test的定义(你定义在调用的后面了)。这其实没关系的,只是警告而已。
接着assuming extern returning int大概是说,编译器认为(assuming)这个函数定义在其它.c文件(extern)中了,并且由于从调用test(c)中无法知道函数的返回类型,编译器假定这个函数返回int类型,又,c是int类型,所以编译器至此假定函数test的类型是int test(int).
C:\Program Files\Microsoft Visual Studio\MyProjects\over\over.c(14) : error C2371: 'test' : redefinition; different basic types
大概是说在over.c文件的14行,函数test重定义了,基本类型不一样。也就是说你定义的test函数类型和编译器之前的推断类型不一样,所以编译器判断你在这里向重新定义一个名字叫test的函数,这在C语言中是不允许的。
明白以上道理后,其实你只要把你的定义void test(int v){...}改为int test(int v){...}就不会报错(当然正确的做法应该看前面版主的做法)
页:
[1]