關於C和C 編譯器引發的一系列問題

2021-08-03 22:39:36 字數 1215 閱讀 2924

參考資料

__cplusplus是乙個預定義巨集,只要你的檔案字尾名是.cpp,則該巨集便有了。但是,我們通常需要在c++檔案了只用一些c的函式,由於c++的多型特性,同名函式可以執行不同的功能,為了加以區分,則會在編譯的時候修改函式名,而這和c編譯的結果就不一樣了,從而導致通常在c++檔案裡呼叫c函式是提示無法連線,最近,我就遇到了。

我的實際情況是,基於onvif閘道器(c實現)開發乙個**統計(使用opencv)的系統,我沒有直接新建工程,而是在原有的c語言(.c檔案)寫的乙個工程直接新增**:

#include//這是c++版本

using namespace cv;

但是,問題出現了,opencv庫無法使用,但是我之前在其他工程是銘心啊測試成功的,所以庫沒有問題,後來通過多方求助,.c檔案是直接使用c編譯器,對於c++版本的opencv當然無法使用了,很直觀的想法,通過修改字尾名為.cpp來使用c++編譯器,果然,opencv的問題邁過去啦,雖然產生了其他問題,不知道是進步了還是退步,但是,至少問題在改變,心裡總是舒服的,這就是工程師(程式設計師),不安天命,不安於現狀,於動盪中求生存。如果一直明對同乙個難題,相信很多人都會崩潰的,哈哈哈。

接下來,說一說新產生的問題,opencv問題解決之後,導致之前很多c函式無法鏈結成功,這個問題很熟悉啦,無法連線通常是沒宣告啊,但是相關函式的標頭檔案明明是包含了的啊,這就涉及到編譯器的顯示指定啦。

# ifdef __cplusplus 

extern "c"

# endif

因為我們採用了c++編譯器(通過修改字尾名為.cpp),原先的所有檔案都轉而採用c++編譯器了,這就導致原先的很多c函式在編譯之後名字改變了,導致後續的呼叫產生無法鏈結的錯誤(找不到宣告),那怎麼辦呢?此處有兩種方法:

1.找到函式在編譯後的新函式名字,然後去修改呼叫此函式的**

2.強制使用c編譯器,而不是使用c++編譯器。

顯然,第二種方法會好很多,需要修改的內容也少,那就使用第二個方法吧。不管你用什麼方法,先找到出錯的函式的宣告檔案,然後使用

# ifdef __cplusplus 

extern "c"

# endif

包含函式宣告的主體部分,這樣就強制使用c++編譯器了。但是,如果有人就是找不到宣告的標頭檔案呢,怎麼辦,你要是懶得去找,那就直接新建乙個宣告檔案,同樣用上名的**包含宣告函式,如此,所有問題也就解決了。

關於陣列去重問題引發的一系列思考

其實取這個名字可能不太符合實際,畢竟沒有 一系列 問題引發是牛客網上js的陣列去重程式設計題,先放乙個正確版本的 array.prototype.uniq function 第一次出現的值 if arr i arr i else return newarr 嘛,本來事情到這裡ac通過了就沒有之後的下...

關於c 繼承的一系列問題總結

物件導向設計的重要目的之一就是 重用,而繼承和多型是物件導向的兩個最主要的特徵。本文將主要圍繞c 中的繼承展開討論,並以一些簡單的例子來說明。一.首先觀察在繼承中,成員物件的初始化。1.建立派生類物件時,程式首先建立基類物件,這意味著基類物件應當在程式進入派生類建構函式前被建立。2.派生類建構函式應...

關於C標準和編譯器

編譯執行源 時出現錯誤error main must return int 將main函式返回型別由void改為int,編譯執行成功。通過蒐集資料知道,這是由於c標準變化產生的問題。在世界第乙個完整的c語言標準c89 c90中,main 是正確的。但在c99標準中,只有以下兩種定義方式是正確的 in...