C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

时间:2022-02-12 15:42:56
在公司的播放器代码里找到一个文件,发现里面的函数是这样定义的:

static int mem_write(b , in , inl)
BIO *b;   //一个结构体指针
char *in;
int inl;
{
   ...   //具体就不写了,用到了上面的变量
}

我发现这个代码是可以用公司的gcc编译通过的(具体是哪个版本我不清楚,因为我刚来的),此外,我发现如果我在公司的代码里没有将变量声明写在函数体中开头的位置,而直接在需要的时候直接上定义,那么在编译时会报错的(用的是gmake -f makefile.mk指令),报错会显示声明前有可执行语句,请问这是编译器控制的,还是用makefile或者其他什么控制的?

13 个解决方案

#1


这是老式函数定义 
叫做 K&C 式样的函数定义
具体做法是
函数参数表里只写参数名
参数在参数表的小括号后面定义(声明) ;
参数声明语句(若干个),有语句结束符分号;
然后才是函数体
static//函数存储类型
int     //函数(返回值)类型 
mem_write(b , in , inl) //函数头 参数表的小括号里,只有参数名字。
BIO *b;   //一个结构体指针  //参数 b的声明
char *in;//参数 in的声明
int inl;//参数 inl的声明
{//函数体开始的大括号
   ...   //具体就不写了,用到了上面的变量
}//函数体结束的大括号

#2


这得多老的代码了 C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#3


C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#4


叫做 K&R  式样的函数定义 

#5


C程序设计语言 K&R C

#6


涨知识了。。。。。。。。。 C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#7


该回复于2014-07-27 08:55:10被管理员删除

#8


该回复于2014-07-27 14:42:24被管理员删除

#9


谢谢大神的回答,这是一个10年前开始的项目了,一直升级沿用到现在,而且是日本一线厂商的智能蓝光播放器里的代码,不过貌似这一段没用了,但是没有删。
我想知道我的第二个问题,就是变量的定义必须定义在函数体的开头,也是因为这个代码比较早的原因吗?

#10


引用 9 楼 shenmafuyunnan 的回复:
我想知道我的第二个问题,就是变量的定义 必须定义在函数体的开头,也是因为这个代码比较早的原因吗?


这是你所用编译器不支持C99的原因

#11


确实是很老了。最新的编译器应该都支持的。

#12


涨姿势...

#13


C 语言,还支持这种形式的函数定义。
C++ 就不一定支持了
如果需要编译这种函数
把他放在 .c文件里,参与编译。

#1


这是老式函数定义 
叫做 K&C 式样的函数定义
具体做法是
函数参数表里只写参数名
参数在参数表的小括号后面定义(声明) ;
参数声明语句(若干个),有语句结束符分号;
然后才是函数体
static//函数存储类型
int     //函数(返回值)类型 
mem_write(b , in , inl) //函数头 参数表的小括号里,只有参数名字。
BIO *b;   //一个结构体指针  //参数 b的声明
char *in;//参数 in的声明
int inl;//参数 inl的声明
{//函数体开始的大括号
   ...   //具体就不写了,用到了上面的变量
}//函数体结束的大括号

#2


这得多老的代码了 C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#3


C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#4


叫做 K&R  式样的函数定义 

#5


C程序设计语言 K&R C

#6


涨知识了。。。。。。。。。 C语言问题 变量声明在函数名和大括号(“{”)间,能编译通过,求解释

#7


该回复于2014-07-27 08:55:10被管理员删除

#8


该回复于2014-07-27 14:42:24被管理员删除

#9


谢谢大神的回答,这是一个10年前开始的项目了,一直升级沿用到现在,而且是日本一线厂商的智能蓝光播放器里的代码,不过貌似这一段没用了,但是没有删。
我想知道我的第二个问题,就是变量的定义必须定义在函数体的开头,也是因为这个代码比较早的原因吗?

#10


引用 9 楼 shenmafuyunnan 的回复:
我想知道我的第二个问题,就是变量的定义 必须定义在函数体的开头,也是因为这个代码比较早的原因吗?


这是你所用编译器不支持C99的原因

#11


确实是很老了。最新的编译器应该都支持的。

#12


涨姿势...

#13


C 语言,还支持这种形式的函数定义。
C++ 就不一定支持了
如果需要编译这种函数
把他放在 .c文件里,参与编译。