2010-04-09 99 views
10

有些時候,我看到的功能定義如下:爲什麼在括號外聲明參數類型?

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

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

這裏有什麼說法

char *dir; 

的重要性是什麼內涵後面的函數名後不久宣佈的指針,然後啓動函數體。

回答

12

這是一個較舊的C語法,kalled「K&R C」,因爲它是在legendary book的原始版本中出現的。

曾經被認爲是這樣寫的:

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

現在

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

它僅僅是「舊式」 K&R C函數的定義(見Kernighan & Ritchie's book,通常簡稱爲Kernighan的&裏奇

你指的可能已被寫入在八十年代末的代碼,或考慮到可移植性(即與較老的編譯器兼容,可能在更多「異國情調」的平臺上)。

即使是1989年C標準公佈後,多年來ķ& 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 */ 
) 
{ 
} 

ķ& R風格定義已經過時自1989年以來;參見 第6.9.5節C90標準中的「功能定義」。

相關問題