我对C很新,我一直在研究别人的代码,我发现了这个功能:
static
cp_file(output, input, record, ft)
dy_char *output; /* output file */
dy_char *input; /* input file */
dy_char *record; /* record id */
int ft; /* file type */
{
这与说这个完全相同:
static cp_file(dy_char *output, dy_char *input, dy_char *record, int ft) {
一个比另一个更有效,还是纯粹是一种不同的语法风格?如果它们不同,有什么区别?
答案 0 :(得分:4)
不,他们不一样。
第一种形式是旧式函数定义,第二种形式是函数定义的原型形式。
它们在传递转换的参数方面有所不同。具有原型转换参数的函数就好像通过赋值一样,而非原型函数就像在第一个示例中那样执行默认参数提升。
旧表单的参数转换:
(C99,6.5.2.2p6)“如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double。这些被称为默认参数促销。“
原型表格的参数转换:
(C99,6.5.2.2p7)“如果表示被调用函数的表达式具有包含原型的类型,则参数被隐式转换,就像通过赋值一样,转换为相应参数的类型,每个参数的类型是其声明类型的非限定版本。“
请注意,旧表格(非原型)已过时,强烈建议不要使用。
(C99,6.11.7p1未来语言方向)“使用具有单独参数标识符和声明列表的函数定义(不是原型格式参数类型和标识符声明符)是一个过时的功能。”
答案 1 :(得分:2)
两者都相同,但是,
后者是标准的符合语法,而前者是模糊的 K&R syntax 。
总是,在编写任何新代码时使用标准符合的方式,旧的代码库可能会使用K& R语法,因为它是当时常用的语法。
答案 2 :(得分:2)
是的,除非ouah指出,否则这两种陈述大多相同。这是用于声明函数的“原始”ANSI前语法。它在1990年代早期就被废弃了。