詳細內容可以參考:關於extern"c"(詳細剖析)
在一些標頭檔案中經常見到這些語句:
#ifdef __cplusplus
//注意,是兩個下劃線
extern
"c"#endif
我們知道這段**是在c++呼叫c**的時候使用的,
作用是讓c++**和c**相容,防止編譯報錯——一般是鏈結錯誤,找不到某某函式。
可以多問幾個為什麼,深究下。
為什麼不加這幾行**會報錯,而且是鏈結錯誤,找不到某某函式?
因為編譯器將源**編譯成目標檔案時,會將函式名,全域性變數,靜態變數名稱進行修飾,形成符號名,而且對c++**和c**的修飾規則不同,c語言中沒有extern "c"的語法,在c++中加extern "c"就是告訴編譯器,這些語句要按照c語言的規則進行修飾,這樣鏈結的時候才能找到對於的函式。
編譯器是怎樣判斷原始檔是c++還是c的?
c++編譯器會在編譯c++程式時預設定義」_cplusplus「,所以可以通過條件巨集 "#ifdef _cplusplus"來判斷當前編譯單元是否是c++。
上面一段程式的含義:如果當前編譯單元是c++,那麼func函式會在extern 「c」 中被宣告,如果不是c++,#ifdef和#endif中間的程式都不會執行,func直接宣告。
關於git的一些常見使用
列出本地所有分支和遠端分支 git branch a 列出所有遠端分支 git branch r 列出本地分支 git branch 檢視本地分支跟蹤的遠端分支 git branch vv 建立本地分支 git branch x 提交到遠端分支 git push origin x 切換到分支 x g...
關於Servlet中一些常見錯誤
1 關於頁面亂碼問題一般會有以下兩種解決方式 servlet輸出亂碼問題 response.setcharacterencoding utf 8 request.setcharacterencoding utf 8 2 servlet.中不像jsp頁面 有session的內建物件 一般要先宣告 如 ...
關於Git 的一些常見命令
git clone 位址 這是下拉命令 git config global credential.helper store 儲存密碼 git config system unset credential.helper 清除錯誤登陸快取 git status 檢視修改資訊 git add 檔案路徑 檔...