2012-03-23 74 views
3

可能重複:
What is useful about this C syntax?
C variable declarations after function heading in definition
What weird C syntax is this?的C語句

我想了解一些代碼,它有類似如下:

int getr(fget) 
FILE *fget; 
{ 
    /* More declarations and statements here */ 
    return (1); 
} 

是否有上述之間的任何差別:

int getr(fget) 
{ 
    FILE *fget; 
    /* More declarations and statements here */ 
    return (1); 
} 

如果是這樣,他們是如何不同?

+0

@保羅R.你是正確的,這是問題的一個副本。是否可以編輯該問題的標題更具描述性? – mgilson 2012-03-23 17:43:13

回答

7

這兩個函數都是以舊式(非原型)形式聲明的。現在的C標準中舊式函數聲明已經過時,C標準強烈阻止它們的使用。

在第二種形式中,沒有提及假設爲intfget參數類型。然後聲明FILE *類型的另一個對象fget,並使用相同名稱對參數變量進行遮蔽。

隨着gcc-Wshadow警告選項會得到你一個警告,在你的第二個例子,因爲參數的陰影中:

-Wshadow 
     Warn whenever a local variable shadows another local variable, 
     parameter or global variable or whenever a built-in function is shadowed. 
+0

所以我認爲「鼓勵」的方式來做到這一點:'int getr(FILE * fget){...}'? (最好使用文件頂部的原型) – mgilson 2012-03-23 06:47:06

+0

@mgilson:是的,您應該定義函數爲:'int getr(FILE * fget){...}'。這是原型語法中的函數定義。請注意,此函數定義還可以作爲稍後在源代碼中的原型。 – ouah 2012-03-23 06:55:41

7

的第一個是K & R style of function definition,它是一個過時特徵註釋1

第二個是俗稱爲隱式int功能之前的c99標準。
c99之前如果一個函數沒有返回顯式類型,或者沒有在聲明中指定一個類型,那麼該類型被假定爲int

的方法都已經過時,並找到與C99標準中提及。

參考文獻:
C99標準:前言第7段:

在第二版的主要變化包括:
- 刪除隱式int類型
- 刪除隱函數聲明

參考1
6.11.7函數定義

與單獨的參數標識符和聲明列表 (未原型格式參數類型和標識符說明符)使用的函數定義爲過時特徵。

+0

請問:爲什麼downvote? – 2012-03-23 07:02:04

+0

不是我,但可能是因爲你說K&R風格不符合標準?它仍然(甚至是C11)標準,但不推薦使用。 – 2012-03-23 07:07:40

+0

-1當你的整個評論是*「第一個是K&R風格的函數定義,它是非標準的。」*。氣餒!=非標準。過時!=過時。如我錯了請糾正我。 – Morpfh 2012-03-23 07:13:51