ANSI C前的函式定義是什麼樣子? 詳解

2021-09-25 19:39:40 字數 1790 閱讀 8520

最近在看《a retargetable compiler design and implementation》(可變目標c編譯器設計與實現),由於鄙人資歷尚淺,沒有見過上古版本的c語言函式的樣子,看這本書第一章的時候,直接懵逼。舉個例子,函式的樣子如下:

為了不讓各位和我有類似的經歷,因此打算寫個文章記錄一下,也算學習一下歷史。

本文以簡略的語言概括了參考文獻的主要內容,如果有朋友想進一步了解,可以詳細閱讀參考文獻。

眾所周知,c語言誕生與70年代的貝爾實驗室(bell laboratories),brian kerninghan 和 dennis ritchie兩位大牛c 經典著作 the c programming language ,因為該書影響甚廣,因此最早的c語言就以書中寫法為標準,被稱為k&r 標準(源自於兩位作者的姓的首字母)。

那個時候c語言的函式寫法是這樣的:

//k&r 標準

add(a, b)

大家一定很好奇,為什麼沒有資料型別,因為早期的c語言並不關注資料的型別,所有的資料型別都會當成int型處理,因此寫與不寫是一樣的,可以省略型別,這樣既方便處理,又可以加快編譯的速度。

如果加上型別的話是這樣的:

//k&r 標準

intadd

(a, b)

int a;

int b;

這也就是在我們書**現的寫法,後來隨著c語言的廣泛應用,逐漸衍生出了多個版本,每個版本都已自己特有的資料型別,而資料型別的處理也不再是簡單都按照int處理,這時,人們覺得有必要將c語言進行標準化了。

1983 年,美國國家標準化組織(american national standard institute,ansi) 成立 c 語言工作小組,開始進行標準化工作。

1989 年,c 語言標準草案被 ansi 委員會接納。這個 c 語言標準就叫c89,又叫ansi c

在這之後c語言函式的寫法就變成了我們今天熟悉的樣子:

//ansi c 標準

intadd

(int a,

int b;

)

除此之外 ansi c最大的改變就是函式原型,又叫函式宣告,對於k&r標準來說,函式宣告是不檢查引數型別的,只檢查引數名稱,但是ansi c標準將其作為乙個整體檢查。

k&r c 的原型:

//k&r c 標準

char

*strcpy()

;

就變成了:

//ansi c 標準

char

*strcpy

(char

* dst,

const

char

* src)

;

ansi c 的函式原型其實是從 c++ 借鑑過來的。c++ 擴充套件了最初的 c 語言,新增了物件導向、模板、函式過載等功能。對於 c++ 的函式過載,只有函式的名字是不夠的,需要跟引數型別一起生成鏈結名字,這個過程稱為 name mangling。另外新增函式原型,可以讓編譯器檢查函式呼叫型別和引數個數是否有錯。k&r c 的函式呼叫語句是不作任何檢查的,需要程式設計師自己注意。

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

青春是什麼樣的味道?

青春是怎樣的乙個經歷?青春在我們的心裡又留下了怎樣的感覺?青春是酸的 是甜的 更是苦的。那你的青春你是怎樣的味道?不知何時我們的已經忘記了自己的目標,作為一名今年就畢業的大學生的我。我們的青春裡面充滿了酸甜也有苦。在上大學的期間,我們常常會因為自己的高考的不如意而進入這樣的一所大學而怨天尤人,每天都...

青春是什麼樣的味道?

青春是怎樣的乙個經歷?青春在我們的心裡又留下了怎樣的感覺?青春是酸的 是甜的 更是苦的。那你的青春你是怎樣的味道?不知何時我們的已經忘記了自己的目標,作為一名今年就畢業的大學生的我。我們的青春裡面充滿了酸甜也有苦。在上大學的期間,我們常常會因為自己的高考的不如意而進入這樣的一所大學而怨天尤人,每天都...

青春是什麼樣的味道?

青春是怎樣的乙個經歷?青春在我們的心裡又留下了怎樣的感覺?青春是酸的 是甜的 更是苦的。那你的青春你是怎樣的味道?不知何時我們的已經忘記了自己的目標,作為一名今年就畢業的大學生的我。我們的青春裡面充滿了酸甜也有苦。在上大學的期間,我們常常會因為自己的高考的不如意而進入這樣的一所大學而怨天尤人,每天都...