老標準的C語言這樣定義函式方法嗎?

時間 2021-06-01 02:18:56

1樓:

這是 ANSI C 出現之前的事了,後來大家發現,這種寫法在宣告函式時無法檢查引數型別,於是就在 ANSI C 中改進了。

但是現在好像還有一些 UNIX 的系統原始碼,為了穩定而沒有做改動。

在《K&R》第二版附錄裡有講。

2樓:SuperSodaSea

參考標準:

C11(ISO/IEC 9899:2011)

C++11(ISO/IEC 14882:2011)

實際上現行標準中也是能用的:

C11 6.9.1 函式定義

如果宣告符包含乙個引數型別列表,則每乙個引數的宣告應當包含乙個識別符號,除了引數列表只包含乙個void型別的情況,且在此情況下不應該包含識別符號。在宣告符之後不應該帶有宣告列表。

如果宣告符包含乙個識別符號列表,則宣告列表中的每乙個宣告應當包含至少乙個宣告符,這些宣告符應當只宣告識別符號列表中的識別符號,並且每乙個識別符號列表中的識別符號都應當被宣告。乙個用於typedef名稱的識別符號不能被重新宣告為引數。宣告列表中的宣告必須不包含除了register之外的儲存型別說明符以及初始化。

(略)如果宣告符包含乙個引數型別列表,則這個列表同時指定了所有引數的型別;這樣的宣告符也同時作為函式的原型在相同翻譯單元中的相同函式的呼叫中使用。如果宣告符包含乙個識別符號列表,則引數的型別由其後的宣告列表所宣告。(略)

沒看過標準的話可能會有點迷糊,這裡解釋一下,前兩段話分別對應了現在常用的方式和老的定義方式。比如說:

intfunc

(inta,

intb

)其中(int a, int b)是宣告符,它包含的是引數型別列表,所以其後沒有宣告列表,引數的型別由其自身指定。

intfunc(a

,b)inta,

b;其中(a, b)是宣告符,它包含的是識別符號列表,所以其後要跟隨宣告列表。宣告列表自然是說int a, b;,引數的型別也在此宣告。

然後是C++:

C++11 8.4 函式定義

可以看出這種寫法在C++裡被閹割了,答主也就不再細說了。

歷史之類的等下更……

關於c語言自定義的函式,如果是void型別,那麼嚴格意義上這個函式它是返回空值還是根本就沒有返回值?

斷賦千歌 當呼叫乙個 long 返回值的函式時,執行函式的 return 語句時,會將返回值刻意存放在 rax 中。意味著呼叫者可以讀取 rax 來獲得函式返回的結果。void 函式,在執行 return 語句時,不會刻意的修改 rax 的值 在函式的呼叫的過程,會利用 rax 暫存器作為臨時變數,...

C語言有沒有簡單的方法,能讓函式中執行return之後,再次再執行另外一段命令?

典型的AOP操作。比較有共識的實現方式是函式巢狀來實現,就是外函式做你說的那些額外功能,內函式實現主要的計算邏輯。當然c的話還可以用巨集等奇技淫巧。但是你說簡單的話那估計不行 gcc 可以用 attribute cleanup fn int var 實現。這個類似於給 var 加了個析構函式 fn。...

Windows C 語言和標準的 C 語言有何不同?

Summer Mr c語言標準有很多,標準的c語言標準是ANSI C,這在Windows下和linux下或其他平台上一樣,比如一些常見的字元操作函式,輸入輸出函式的原型都是一樣的,但是可能因為平台上編譯器的實現的不同而略有差異。 學一下彙編或者反彙編就明白了。各種語言對函式呼叫引數的不同傳遞方式.比...