Sunday, July 18, 2010

Linkage Directives: extern "C"


◎Abstract
在C++程式中,有時會呼叫其它程式語言所寫的函式,本文將會以: 如何在C++程式中呼叫「C」語言的函式為例子來說明Linkage Directives — extern的使用方法時機,以及一些使用上該注意的事項。

◎Declaring a Non-C++ Function
有兩種方式可以在C++中宣告C函式「single「compound。如果單獨宣告某個函式或變數則使用single的用法;反之,當宣告兩個以上的函式或變數時,則使用compound的用法。使用方法分別如下:
  • single
// single statement linkage directive
extern "C" int func(int);

  • compound
// compound statement linkage directive
extern "C" {
    int func(int);
    double var;
}



Compatibility between C/C++ compiler
為了讓C++的compiler可以引用C語言的一些函式並且不影響原本C語言compiler的處理,也就是,使C與C++的compiler能夠相容我們常常可以在C語言的系統標頭檔、函式庫看到以下這種用法

#ifdef __cplusplus 
extern "C" {
#endif

int func(int);

#ifdef __cplusplus
}
#endif

它代表的是,如果編譯的是C++程式碼,則函式func」會使用extern "C"」來宣告; 如果是C程式碼,則直接宣告

※ 當我們使用C++編譯時,__cplusplus會被自動定義


Overloaded Functions
我們都知道,C++支援Function Overloaded,而C語言並不支持。因此,在C++ Primer(Ref.1)中有底下這麼一題練習題
Exercise18.34:
Explain these declarations and indicate whether they are legal:
extern "C" int compute(int *, int);
extern "C" double compute(double *, double);
答案是:
  • 如果其中一個宣告單獨出現,那麼會是沒問題的
  • 但是,當兩個宣告一起出現的話,就會因為C語言不支持Function Overloaded」而產生錯誤
這是在使用extern "C"」上必須注意的地方

◎Reference
  1. C++ Primer, 4th Edition, S. B. Lippman, J. Lajoie and B. E. Moo
  2. 程式設計師的自我修養 — 連結、載入、程式庫,俞甲子、石凡、潘愛民
  3. http://en.wikipedia.org/wiki/Name_mangling

Friday, July 16, 2010

汽車保養 — 五油三水

前題
因為最近在軍中的高裝檢被分配在輪車組,而對保養進度中的「五油三水」感到好奇,well,反正以後開車也會遇到這些問題,就索性好好來認識這些保養知識 (當兵,還是可以學習很多東西滴)五油三水是汽車的基礎保養,目的就是要讓你的愛車保持健健康康的,如此也可增加行車安全 (行車安全是目前軍中除了救災外,另一項極度注重任務 XD)。雖然現今大部份的車子都擁有電腦噴射引擎系統,可以用來監控各項設施並反應在汽車內的儀表板上,但我們還是得認識一下各項設施所賦予的功能,才有辦法在故障的第一時間做出正確的解決判斷

五油
  • 引擎機油
    老舊的車子可能導致吃機油的現象
    ,我們可以利用油尺來檢察機油是否足夠
  • 汽油
    ...略!!!
    (開車必須要有汽油 XD)
  • 變速箱油(自排油)
    一樣利用油尺來檢查
    ,並且經由其顏色的鮮艷程度可以判斷該油是乾淨或是髒的;甚至如果它的味道聞起來具有焦味,則表示離合器片有不當摩擦現象
  • 煞車油
    打開引擎蓋即可觀察其數量
    ,但需要在規定的時間做更換的動作,如此可以避免因為吸入太多水氣,使沸點降低,而提高煞車失靈機率
  • 方向機油
    參考資料指出許多人會拿機油來代替方向機油
    ,但為了避免方向機受損,盡量使用方向機專用油。此外,也應該避免所謂的Understeer」及Oversteer如下圖:

  •  Understeer
  •  Oversteer


三水 
  • 引擎冷卻水(水箱水)
    水箱水
    的功能就在於散熱,又名引擎冷卻水,因此我們可以瞭解它目的就是要散引擎所產生的熱。有些人會添加水箱精,它主要可以提高沸點降低凝固點,副加價值是防銹省油
  • 雨刷水
    略!!!
    (建議直接用自來水因為參考資料說玻璃清潔劑會有副作用)
  • 電瓶水
    略!!!
    (目前多為免加水電瓶else, 就加個蒸餾水吧)

參考資料
  1. http://www.carbibles.com/
  2. http://car.cool3c.com/article/7483