我有一個超過10年的C庫 - 我相信 - 在過去的美好時光裏工作得很好,但是當我試圖在C++源代碼中使用它時(包含主函數)遇到了一些困難。如何使用C++將舊C代碼與保留關鍵字相關聯?
編輯:爲了澄清,C庫編譯得很好,用gcc
,它生成一個目標文件old_c_library.o
。這個庫是應該以某種方式使用,以便您的main.c
C源文件中的C頭文件old_c_library.h
爲#include
d。然後,您的主C源文件應該編譯並通過與old_c_library.o
鏈接在一起。在這裏,我想使用C++源文件main.cpp
來代替,並使用g++
進行編譯/鏈接。發生
以下三個問題,C++源文件的編譯過程中:
- C庫的頭文件中的一個包含所述C++保留字
new
(它是一個整數的名稱),導致致命錯誤;和 - C庫的其中一個頭文件包含
calloc
調用(缺少明確的類型轉換),導致致命錯誤;和 - C庫的各種文件包含代碼,其中發生了帶符號和無符號整數的比較,從而導致警告。
編輯:我試圖使用#extern "C" { #include "obsolete_c_library.h" }
「竅門」,正如評論中所建議的那樣,但這並沒有解決我的任何問題。
我可以通過重命名保留字的所有實例並將其替換爲 - 基本上 - 其他任何內容來解決問題1。我可以通過調用calloc
調用來解決問題2。我可能會嘗試通過此處提出的建議來解決警告:How to disable GCC warnings for a few lines of code。
但我仍然想知道,有沒有辦法以優雅,高級的方式克服這些困難,沒有實際上觸摸原始圖書館?
相關: Where is C not a subset of C++?和Do I cast the result of malloc?和How do I use extern to share variables between source files?。
在包含使用'new'作爲變量名稱的標題後,您可以在之前放置一個'#define new old',並在'#undef new'處輸入 – user463035818
如果關鍵字問題僅出現在舊庫的實現中不是它的API),爲什麼不單獨編譯並且只將它鏈接到C++項目中? – nils
唯一的優雅方式可能是更新庫。一旦你被要求讓代碼腐爛,優雅就會消失,你將不得不使用任何骯髒的黑客來完成工作。 – ComicSansMS