2012-03-01 69 views
0

我很新的C,我一直在學習別人的代碼,我發現這個功能:函數語法用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) { 

是比另一個更有效率,還是純粹是一種不同的語法風格?如果他們不同,有什麼區別?

+1

這是一個騙局。 – 2012-03-01 17:00:15

+4

由於這是一種非常古老的風格,您可能正在查看真正舊的代碼。這可能不是一個好榜樣,如果你想學習C. – zmccord 2012-03-01 17:02:34

+1

好點,謝謝zmccord – 2012-03-01 17:03:29

回答

4

不,它們不完全相同。

第一種形式是舊式函數定義,第二種是函數定義的原型形式。

它們在參數傳遞轉換方面有所不同。帶有原型的函數像通過賦值一樣轉換參數,而像第一個示例中那樣的非原型函數執行缺省參數提升。

參數轉換爲舊錶:

(C99,6.5.2.2p6)「如果它表示所調用的函數的表達有一個類型不包括一個原型中,整數優惠執行上每個參數和具有float類型的參數都被提升爲double,這些被稱爲默認參數促銷。「

參數轉換爲原型形式:

(C99,6.5.2.2p7)「如果它表示所調用的函數的表達有一個類型確實包括一個原型,參數被隱式轉換,就好像通過賦值一樣,將相應參數的類型賦予每個參數的類型,使其成爲其聲明類型的非限定版本。「

請注意,舊窗體(非原型)已過時並且強烈不鼓勵。

(C99,6.11.7p1未來語言方向)「的使用與單獨的參數標識符和聲明列表函數定義(未原型格式參數類型和標識符說明符)是一個過時的功能。」

+1

+1。距離我在實時代碼中遇到過這樣一個原型已經有二十年了,並且完全忘記了這一點。 – 2012-03-01 17:09:54

+0

很好解釋,謝謝 – 2012-03-01 17:11:32

2

兩者是相同的,然而,
後者是標準符合的語法,而前者是晦澀K&R syntax

總是在編寫任何新代碼時使用標準一致性方式,舊代碼庫可能會使用K & R語法,因爲這是當時常用的語法。

+0

難懂的K&R? - 只有你whippersnappers :) – KevinDTimm 2012-03-01 19:58:46

2

是的,除ouah指出的以外,這兩種說法大多相同。這是用於聲明函數的「原始」pre-ANSI語法。它在二十世紀九十年代初被廢棄了。