歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

用extern關鍵字使程序更加清晰

一、基礎研究

之前基於tcc、tlink實現一個新的編譯連接工具cc.exe,用到的文件有cs.lib、c0s.obj、main.obj,其中main.obj是我們自己加入的文件,它可以實現開始顯示彩色字符串“welcome to c”,等待用戶按鍵後執行程序,現在我們要把它替換為下面的程序編譯成的obj文件:

 

觀察程序,發現在定義指針code和函數指針f的時候用到了extern關鍵字。extern可置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。這是一個聲明語句,但是在當前程序中沒有定義,所以我們要在其他文件中對它們進行定義。

這裡main函數的功能為用戶輸入字符串a和b以及符號ch,判斷輸入的符號並調用相應函數進行計算。

寫一個程序mc.c,用cc編譯後運行。

這需要我們把實現“+、-、*、/”的函數和函數指針的定義在mc.c中實現。

編寫程序如下:

 

結果編譯出現錯誤。這說明**f和*f[4]在這裡是不一樣的,這是為什麼呢?

既然不能直接初始化指針f,那麼我們就定義一個函數指針數組來存放函數的首地址,再把這個數組的首地址賦給指針f。即指針f存儲的是函數數組元素的地址。程序如下:

 

運行結果和程序a.c編譯連接的結果是一樣的。

那麼應該怎麼理解這種開發模式呢?在這裡我們的程序裡甚至不用寫主函數,只需要寫子函數以及對一些變量進行初始化,而要執行的主函數、要執行的語句都已經封裝在編譯工具裡,這是比較高度地封裝,但是它也有局限性,比如只能實現操作符的擴展,只能對兩個數進行計算等。

 

二、擴展研究

(1)**f和*f[4]在這裡是不一樣的,這是為什麼呢?

 答:只有*f和f[]能夠隨意互相替換,因為它們的數據都是順序存儲的,而數組和指針的一個最大的區別就是數組能夠注明數據存儲的順序,比如f[][3]={{1},{2,3},{4,5,6}}在內存中的存儲數據是100230456.一維以上的數組和一級以上的指針的存儲數據的方式已經是不同的了,所以不能互換了。

三、研究總結

我覺得我現在對封裝的理解是它可以使程序更具有針對性,專門用來解決一個問題或者一系列問題。它在一定程度上減少了程序的可擴展性,但是加強了程序的精簡度和針對性。也就是說,實現一個功能變得更加簡單和快速了,而要豐富一個項目程序,我們要做的是增加它的功能模塊而不是加大單個程序。這正是符合電腦組成原理、編程原理、人類社會的運行規律,即有序,分工明確,各部分專精,使單個單位的效率達到最大。

Copyright © Linux教程網 All Rights Reserved