为什么在括号外声明参数类型?

时间:2010-04-09 12:27:03

标签: c function coding-style

有些时候我看到函数的定义如下:

read_dir(dir)
char    *dir;   
{
        DIR * dirp;
        struct dirent *d;

        /* open directory */
        dirp = opendir(dir);
  ......... so  on

这里声明的重要性是什么

char    *dir;

在函数名称之后很快声明指针然后启动函数体的内涵是什么。

2 个答案:

答案 0 :(得分:12)

这是一种较旧的C语法,卡住了“K&R C”,因为它是legendary book的原始版本中出现的。

以前写的是这样的:

foo(a, b)
int a;
int b;
{
}

现在是

int foo(int a, int b)
{
}

答案 1 :(得分:8)

这只是“旧式”,K&R C功能定义(请参阅Kernighan & Ritchie's book,通常简称​​ Kernighan& Ritchie 。)

您提到的代码可能是在八十年代末期或九十年代早期编写的,具有可移植性(即与较旧编译器的兼容性,可能在更多“异国情调”平台上)。

  

即使在1989 C标准发布之后,多年来K& RC仍然被认为是C程序员在需要最大可移植性时限制自己的“最低共同点”,因为许多较旧的编译器仍然在使用,并且因为精心编写的K& RC代码也可以是合法的标准C.

有些人可能相信 K& R风格的函数定义,仍然受编译器支持,更具可读性,实际上不一定是真的;比较:

some_function(param1,param2,param3)
char    *param1;   /* param1 comment */
int     param2;    /* param2 comment */
short   param3;    /* param3 comment */
{
}

/* notice also that return type is explicitly specified now */
int
some_function(
  char    *param1, /* param1 comment */
  int     param2,  /* param2 comment */
  short   param3   /* param3 comment */
)   
{
}
自1989年以来,K& R风格的功能定义已经过时了;看到 第6.9.5节C90标准中的“功能定义”。