簡體   English   中英

使用C ++編譯器編譯C99文件

[英]Compiling C99 files with C++ compiler

還沒有找到我要求谷歌或這里的確切問題,一切都談到想要從c代碼調用c ++或者用c編譯器和其他一些用c ++編譯的一些部分然后將它們鏈接在一起以及由此產生的問題這是我想要的。

我想在我的所有C ++應用程序中使用Visual Studio的C ++編譯器編譯和鏈接C99文件,並且能夠在沒有錯誤和問題的情況下調用c函數。將不會涉及c鏈接器或使用不同編譯器編譯某些部分並在以后鏈接在一起或任何一種技巧。 標題來自C庫(libcurl)和其他一些,因為我想在我的應用程序中使用它們。 我不想使用C ++綁定,我想將c代碼編譯為c ++。 我可以相信c代碼可以編譯為C ++代碼而無需重大修改嗎? 與包含C ++標題時的做法有何不同? 有什么不兼容性?

理論上,C代碼應該能夠編譯為C ++代碼。 在某些時候,Dr.Stroustrup指出,來自K&R的ANSI C版本的所有代碼都使用C ++編譯器編譯,並且具有與使用C編譯器編譯的代碼相同的語義(這被解釋為所有 ANSI C代碼都是有效的) C ++代碼顯然不是這種情況,例如,因為許多C ++關鍵字在C)中不是保留標識符。

但是,如果要使用C ++編譯器編譯代碼,C中的某些習語將需要對C代碼進行實質性更改。 一個典型的例子是需要將void*轉換為C ++中的正確​​類型,這在C中是不需要的,並且似乎在將malloc()的結果轉換為正確的指針類型時不贊成,盡管效果是它阻止了使用C ++編譯器編譯的C代碼(在我看來很好的思考,例如,因為更嚴格的規則可能導致在C代碼中發現問題,即使生產版本是用C編譯器編譯的)。 據我所知,還有一些微妙的語義差異,雖然現在我不能輕易地指出其中一個。 也就是說,使用C和C ++編譯器編譯的相同代碼可能已定義但兩種情況的結果不同。

在實踐中,我懷疑你可以簡單地用C ++編譯器編譯一個非平凡的C代碼體,並獲得一個與原始C代碼相同的程序。 如果你想象一個C ++編譯C程序自帶了徹底的一套測試情況下,可能將代碼移植到C可行++,但它會涉及更多的工作不僅僅是重命名從文件<name>.c<name>.cpp 我可以想象一個工具可以完成所需的轉換(編譯器將C源編譯為C ++源代碼),但我不知道這樣的工具。 我只知道相反的方向產生完全不可讀的代碼(例如Comeau C ++使用C作為便攜式匯編程序的一種形式)。

如果你想使用visual studio這樣做,那就不可能了。 MSVC不支持C99。

C和C ++是兩種不同但密切相關的語言。 C ++ 幾乎是C ++的超集,但並不完全(特別是C ++有C缺少的關鍵字)。

如果您的代碼依賴於C99功能(即C99中的功能但不是C90中的功能),那么您可能會失敗。 微軟的C編譯器不支持C99(除了一些小功能;我認為它允許//評論),微軟已經明確表示這種支持不是優先考慮的問題。 您可以修改代碼,使其有效C90,具體取決於它使用的功能。

Microsoft Visual Studio支持編譯C和C ++(盡管它傾向於強調C ++)。 如果您可以使用MS C編譯器編譯C代碼,我建議這樣做,而不是將其視為C ++。 C ++具有特性,特別是extern "C" ,專門用於連接C和C ++代碼。 C ++ FAQ Lite第32節中對此進行了討論。

如果由於某種原因確實需要將C代碼編譯為C ++,則可以通過一些次要的源更改來完成。 將源文件從foo.c重命名為foo.cpp ,編譯它,並修復報告的任何錯誤。 結果可能不是很好的 C ++,但你應該能夠讓它工作。 有一些構造是有效的C和有效的C ++,具有不同的語義,但它們並不多,而且你不太可能碰到它們(但你應該記住這一點)。

如果你想繼續將代碼保存為C ++,我的建議是繼續進行所需的更改,然后停止將其視為C代碼

實際需要以C和C ++編譯相同的代碼是非常罕見的。 (例如,PJ Plauger需要這樣做,因為他提供了一些旨在用於任何一種語言的庫。)在大多數情況下,C ++的extern "C"和其他功能足以讓你合理地干凈地混合這兩種語言。 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM