一、问题
最近写函数时,遇到了一个比较奇怪的问题,相信也好多人遇到一下的问题:
error: expected declaration specifiers or ‘...’ before ‘(’ token
代码如下:
#include<stdio.h>
struct stu{
char *name;
int score;
} stus[]={
{"zhangsan1",65},
{"zhangsan2",98}
};
void averge(struct stu *,int);
int main(){
int len=sizeof(stus)/sizeof(struct stu);
printf("start...\n");
//数组名可以认为是一个指针
averge(stus,len);
}
void averge(struct stu* stus,int len){
char *name;
int score;
int sum=0;
for(int i=0;i<len;i++){
name=stus[i].name;//第一种形式
score=(*(stus+i)).score;//第二种形式
sum+=score;
printf("%s...%d \n",name,score);
}
printf("平均分:%d...\n",sum/len);
}
当然以上的代码运行和编译是正常的,那么可以对代码进行修改
#include<stdio.h>
struct stu{
char *name;
int score;
} stus[]={
{"zhangsan1",65},
{"zhangsan2",98}
};
void averge(struct stu *,int);
int main(){
int len=sizeof(stus)/sizeof(struct stu);
printf("start...\n");
//数组名可以认为是一个指针
averge(stus,len);
}
void averge((struct stu*) stus,int len){ # 修改部分:对函数的参数加上括号-累死强制转换
char *name;
int score;
int sum=0;
for(int i=0;i<len;i++){
name=stus[i].name;//第一种形式
score=(*(stus+i)).score;//第二种形式
sum+=score;
printf("%s...%d \n",name,score);
}
printf("平均分:%d...\n",sum/len);
}
编译结果如下:
└──╼ $gcc test.c -o test
test.c:25:13: error: expected declaration specifiers or ‘...’ before ‘(’ token
void averge((struct stu )*stus,int len){
二、原因:
我们先来看一下c语言函数的定义:
函数名后面圆括号括起来的部分称为形式参数列表(即形参列表),方括号括起来的部分是可选的。如果有多个形式参数,应该分别给出各形式参数的类型,并用逗号隔开,该类函数称为有参函数。
return_type function_name( parameter list )
{
body of the function
}
这也就是说其中函数中是不能存在其他符号,这就解释了为什么会出现以上的错误,
其实我们所经常见到的是在调用函数时,在传入的参数进行强制类型转换,这与上述的方式是不相同的。
例如
struct dhb
{
int aa;
int bb;
};
struct gxy
{
int dd;
};
struct dhb gx = { 99,88 };
void test(struct gxy* p)
{
printf("p->aa=%d\n", ((struct dhb*)p)->aa);
printf("p->bb=%d\n", ((struct dhb*)p)->bb);
p->dd = 23;
}
int main()
{
struct dhb* p1=&gx;
test((struct gxy*)p1);
printf("p1->dd=%d\n", ((struct gxy*)p1)->dd);
}