筆者在做移植時,將embest ide環境下的例程移到realview
mdk的過程中,曾經遇到這樣乙個問題:在生成工程時,編譯全部通過,但在鏈結時提示許多符號未定義!如果讀者也遇到過這個問題,請繼續看下去,如果鏈結時提示未定義的變數是一些內聯函式(即使用了關鍵字__inline)。那麼就是筆者遇到的問題了。希望這篇文章對您有所幫助。
在mdk中使用關鍵字__inline時,除了執行速度和占用空間和普通函式不一樣之外,還有以下與普通函式不一樣的地方:表現為,不能將其申明為外部函式,即不能將__inline函式定義在乙個外部檔案中然後在引用的檔案中申明為extern型別。
原因是mdk中使用的__inline函式時和標準c++中的inline函式有相同的語義。
在c++標準中,乙個內聯函式在用到它的每個解釋單元需要相同的定義,這樣看來只有內部鏈結的才可能內聯。將外部檔案中的函式鏈結並內聯似乎不可能,特別是外部函式是非內聯的。為了在不同檔案之間的函式可以內聯,必須:
將這些函式放在乙個通用的標頭檔案中,例如foo.h;
將這些函式標記為extern __inline;
在需要該內聯函式時,#include內聯函式所在的標頭檔案。
當編譯器決定不內聯某個函式時,在編譯鏈結之後該函式只有乙個拷貝。注:根據筆者的實驗發現也可以將內聯函式直接定義為__inline。
在mdk中如果將__inline函式申明為extern的話,在編譯時會通過,而在鏈結時會說這些函式沒定義。這點與embest ide不同。embest ide允許將內聯函式在外部檔案中定義,在引用的檔案中,只須申明為extern型別即可通過編譯鏈結。
解決辦法,將內聯函式定義在.h檔案中,在需要引用的檔案中包含該標頭檔案。這樣就可以呼叫標頭檔案中的內聯函式了。並且能正確通過編譯、鏈結。
其實在mdk中at91rm9200的標準庫中也是這麼做的,at91rm9200的標準庫有兩個.h檔案――at91rm9200.h和lib_at91rm9200.h,其中at91rm9200.h中定義一些常量和外圍介面結構體。其中lib_at91rm9200.h中存放的就是庫函式,其庫函式均為內聯函式。
注:以上兩個標頭檔案存放的路徑為c:keilarmincatmelrm9200。(其中mdk安裝路徑為c:keil)
正確地使用Checked Exception
正確地使用checked exception 實際上,如何正確地使用checked exception已經在前面的各章節講解中進行了詳細地說明。在這裡我們再次做乙個總結,同時也用來加深一下印象。從api編寫者的角度來講,他所需要考慮的就是在何時使用乙個checked exception。首先,che...
如何正確地在React中處理事件
1 構造器內繫結this class mycomponent extends react.component this.handleclick this.handleclick.bind this handleclick render click 這種方式的好處是每次render,不會重新建立乙個 ...
如何正確地寫出單例模式
發表於 2014 08 28 分類於 程式設計 閱讀次數 50513 單例模式算是設計模式中最容易理解,也是最容易手寫 的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立乙個執行緒安全的單例,不知道...