簡體   English   中英

在我的C ++程序中使用C代碼需要做些什么特別的事情嗎?

[英]Is there anything special I need to do to use C code in my C++ program?

注意:我使用g ++版本4.3.4來編譯我的C ++代碼。

到目前為止,每當我想在我的代碼中使用C風格的語言元素時,似乎我可以將C語言包含在我的C ++中並與之並行。

我知道C ++ 主要向后兼容C ...所以我想我的問題是這些:

C的哪些部分不能與C ++兼容?

如果我繼續天真地將C語句粘貼到我的C ++代碼中,專業程序員會嘲笑我嗎?

在同一個.cpp文件中使用C和C ++代碼的正確方法是什么?

我可以繼續使用g ++來編譯我的混合代碼嗎?

對於這個問題,我主要關注的是一個處理單個.cpp文件和單個g ++命令來編譯它的解決方案。 在這一點上,我並不真正關心鏈接。

連接C和C ++代碼的一個重要問題是C ++編譯器需要知道它是鏈接使用C調用約定而不是C ++調用約定的函數。 為此,您經常需要將C頭文件包裝成以下內容:

#ifdef __cplusplus
extern "C" {
#endif

... C function declarations here ...

#ifdef __cplusplus
}
#endif

有關詳細信息,請參閱C ++ FAQ

挑出幾個問題:

“在同一個.cpp文件中使用C和C ++代碼的正確方法是什么?” “我可以繼續使用g ++來編譯我的混合代碼嗎?”

如果你想在與常規C ++相同的文件中混合C風格的C ++,那就繼續吧。 您可以信任編譯器來解決任何問題 - 它們將是最小的並且不會影響結構。 聽到它的聲音,你對它本身就沒有興趣獲得C-linkage,所以即使C-Code在它自己的文件中,也要把它編譯為C ++。 事實上,這通常是從C遷移到C ++的一種方式。

如果采用這種方法,您的代碼就不是真正的混合C / C ++。 它是C ++,其中一些代碼使用C風格的程序習慣用法。 C ++完全旨在支持這一點。

“如果我繼續天真地將C語言粘貼到我的C ++代碼中,專業程序員會嘲笑我嗎?”

這取決於您使用它的原因以及原因。 結構良好的C代碼是很好的代碼。 有時候,C +是在特定的問題比C 好得多 在使用C風格的動態內存管理之前要認真思考。 如果你使用原始malloc()/free()並且弄錯了,你應該被嘲笑。

我建議如果你開始采用這種方法,你可能稍后會花時間回顧並考慮你是否會更好地使用程序C的C ++習慣用法。

C ++幾乎是C的超集。因此,您可以在C中使用的任何功能在C ++中都是有效的(但不是相反)。

人們可能會嘲笑你編寫像C一樣的東西,但忽略它們。 我不認為這是天真的,但這可能會讓我天真。 我說不出來。

沒有[真正的]方法在同一個文件中分離C和C ++代碼。 它只是相互配合,因為當你把它編譯成C ++時,它不再是C了。 所以“C和C ++一起”並不是考慮它的方式。

C語言 之間 的唯一 區別 就是將代碼編譯為我所知道的C ++(除了C ++有更多的關鍵字)是void* s的問題。 在C中,它們將隱式地轉換為任何指針類型,但在C ++中,您必須使用顯式轉換將它們轉換為另一種指針類型。 可能還有其他人,但我不知道。

哦,同樣,C ++不支持“default int”。 我現在不知道它是否仍然是有效的C,但是如果你省略變量的類型或函數的返回類型,編譯器就會使用int C ++不這樣做。

大多數優秀的C實踐都可以很好地編譯C ++。 一些額外的指針強制轉換和重命名的標識符將成為合法的C ++。

然而,在風格上,C風格的代碼被認為是可怕的C ++。 可以在C ++編寫的C風格的代碼,這一事實應該如果使用且僅當你不能把它寫在C ++,開始與-也就是說,如果它的遺留代碼。

如果我繼續天真地將C語句粘貼到我的C ++代碼中,專業程序員會嘲笑我嗎?

基本上,是的。 C風格的編碼在C ++中被稱為“可怕的不安全”,剛開始。 這種代碼只能由那些並不真正知道如何使用C ++的人編寫。 通過這種方式,我並不是說做一些非常低級的東西,比如二維重復或二進制重新解釋,但是像指針轉換或手動資源管理這樣的東西,這會讓你嘲笑。

這個問題太寬泛了; 你應該把它分成幾個。 有一種方法可以將C和C ++目標文件鏈接在一起; C ++向后兼容C,您可以使用C ++編譯器來編譯C代碼。

但是,請考慮以下代碼:

int main(void)
{
    int class = 0;
    int private = 1;
    return private-class;
}

它是有效的C代碼,如果編譯為C ++代碼,顯然不會在任何C ++編譯器上編譯。 只是一個例子。

嗯,明顯的關鍵區別是C ++是面向對象的設計而C不是。 也就是說,你不應該有任何可怕的顯示停止問題用g ++編譯C代碼,除非你遇到一個漂浮的討厭的問題。 你可以找到很多很好的參考資料,我承認我的答案遠非詳盡無遺。

確實,你不能在C ++中隱式地從void*出來; 它不會編譯,而你會在C中經常看到它。

在使用它們之前,你還必須在C ++中顯式地聲明函數,在C中你不一定非必須這樣做。(這樣做很好,但不是所有C程序員都這樣做。)

http://www.cprogramming.com/tutorial/c-vs-c++.html既然我已經脫離了我的頭腦,這是一個很好的小參考; 我經常使用它。

暫無
暫無

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

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