簡體   English   中英

為什么 C(或目標 C)中的 function 沒有列出 arguments 允許輸入一個參數?

[英]Why does a function in C(or Objective C) with no listed arguments allow inputting one argument?

C ,當 function 被聲明為void main(); 嘗試向它輸入一個參數(作為第一個也是唯一的參數)不會導致編譯錯誤,為了防止它,可以將 function 聲明為void main(void); . 順便說一下,我認為這也適用於Objective C而不是C++ 對於Objective C ,我指的是類外的函數。 為什么是這樣? 感謝您伸出援手。 我想它類似於Fortran名稱以 i、j、k、l、m 或 n 開頭的變量隱式為integer類型(除非您添加implicit none )。

編輯:目標 C 是否因為與 C 具有更好的兼容性而允許這樣做,或者它的原因類似於 C 有這個的原因嗎?

注意:我保留了問題中的錯誤,因此不需要更改答案和評論。

另一個注意事項:正如@Steve Summit 和@matt( 此處)所指出的,Objective-C 是 C 的嚴格超集,這意味着所有 C 代碼也是有效的 Objective-C 代碼,因此必須顯示有關函數的這種行為。

因為 function 原型不是准標准 C 的一部分,函數只能用空括號聲明:

extern double sin();

所有現有代碼都使用這種表示法。 如果這樣的代碼無效,或者意味着“零參數”,標准就會失敗。

因此,在標准 C 中,像這樣的 function 聲明意味着“采用零個或多個參數的未定義列表”。 該標准確實指定所有具有可變參數列表的函數必須在 scope 中具有原型,並且原型將以, ...)結尾。 因此,用空參數列表聲明的 function 不是可變參數 function(而printf()是可變參數)。

因為沒有告知編譯器 arguments 的數量和類型,所以在調用 function 時它不會報錯,無論調用中的 arguments 是什么。

在早期(ANSI 之前)C 中,編譯器未檢查函數定義與其調用之間的 function arguments 的正確匹配。

我認為這樣做有兩個原因:

  1. 它使編譯器變得相當簡單
  2. C 一直是為單獨編譯而設計的,檢查翻譯單元(即跨多個源文件)的一致性是一個更難的問題。

因此,在早期,確保函數的調用與其定義匹配是程序員或單獨程序lint的責任。

function arguments 的松散檢查也使像printf這樣的可變參數功能成為可能。

無論如何,在原來的 C 中,當你寫

extern int f();

,您不是在說“ f是 function 不接受 arguments 並返回int ”。 您只是在說“ f是一個 function 返回int ”。 你沒有說任何關於 arguments 的事情。

基本上,早期 C 的類型系統甚至沒有辦法記錄 function 所期望的參數。當單獨編譯發揮作用時尤其如此,因為 linker 幾乎僅根據名稱解析外部符號。

C++ 改變了這一點,當然是引入了function 原型 在 C++ 中,當你說extern int f(); ,您正在聲明一個 function,它明確采用 0 arguments。(還設計了一個“名稱修改”方案,其中包括讓 linker 在鏈接時進行一些一致性檢查。)

現在,這在舊的 C 中都有些不足,ANSI C 引入的最大變化是將 C++ 的 function 原型表示法采用到 C 中。但略有不同:為了保持兼容性,在 C 中說extern int f(); 必須被解釋為“函數返回int並采用未指定的參數”。 如果你想明確地說 function 沒有占用 arguments,你必須(並且仍然必須)說extern int f(void); .

還有一個新的...表示法明確地將 function 標記為采用變量 arguments,例如printf ,並且開始擺脫聲明中的“隱式int ”。

總而言之,這是一個顯着的改進,盡管仍有一些漏洞。 特別是,程序員還有一些責任,即確保准確的 function 原型始終在 scope 中,以便編譯器可以檢查它們。 另請參閱此問題


另外兩個注意事項:您詢問了目標 C,但我對該語言一無所知,因此我無法解決這一點。 你說對於沒有原型的 function,“嘗試向它輸入一個參數(作為第一個也是唯一的參數)不會導致編譯錯誤”,但實際上,你可以將任何數字或 arguments 傳遞給這樣的function,沒有錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM