簡體   English   中英

用C風格編寫C ++代碼

[英]Write C++ code in C style

如果我們想用C來寫一個模塊並有將其編譯為C ++ g++ ,是不是OK開發的代碼在C ++中,沒有任何自己的類,只有使用“全局/靜態函數”在C? 所以,簡單地說,用C ++編寫代碼C(只有很少的系統頭改變等)

是。 事實上,這通常是一個好主意,因為C ++強制執行比C更強的類型檢查。

除了僅使用函數之外 ,您還需要做一些事情,特別是您應該將所有函數標記為extern "C"以避免名稱錯位並強制執行C調用約定(並且偶然阻止您進行重載)。 如果您希望能夠在C中編譯它,則在聲明變量( enum for enumerations)時必須使用struct限定類型,或者提供相應的typedef ...

或者,您可以將-xc添加到編譯器選項以告訴g ++將代碼編譯為C(如果您無法將命令行從g++更改為gcc ,則可能無法添加編譯器標志......)

雖然大多數C源代碼將編譯為C ++代碼而不進行任何更改,但某些語言差異會阻止C ++成為C的嚴格超集。

在C中有效,但在C ++中無效

  • C ++有新的關鍵字(類,模板,虛擬等),如果你打算用C ++編譯器編譯它,你不應該把它當作你的C代碼使用它
  • C ++有很多限制性的類型轉換:

在C中有效但在C ++中無效

int *j = malloc(sizeof(int) * 5);

兩者都有效:

int *j = (int *) malloc(sizeof(int) * 5);
  • 枚舉常量(枚舉值)在C中始終是int類型,而它們在C ++中是不同的類型,並且可能具有與int不同的大小。
  • C允許在函數原型中聲明struct,union和enum類型,而C ++則不允許。

在C和C ++中表現不同

  • 諸如'a'之類的字符文字在C中是int類型,在C ++中是char類型
  • static關鍵字在C中用於將函數或全局變量限制為文件范圍(內部鏈接)。 這在C ++中也是有效的,盡管C ++不贊成使用匿名命名空間(在C中不可用)。 此外,C ++隱式地將任何const全局視為文件范圍,除非它是顯式聲明的extern,不像C,其中extern是默認值。 相反,C中的內聯函數屬於文件范圍,而默認情況下它們在C ++中具有外部鏈接。

您可以在此處找到詳盡的不同列表

你可以用很多樣式“編寫C ++” - 這是該語言的基本優勢之一。 這包括C程序通用的嚴格程序,平面編程風格。 你仍然會編寫C ++,但代碼最終應該對任何C程序員都非常熟悉。

嚴格地說,您將不得不使用C ++頭文件<cstdio>等,並且所有C庫函數都在std命名空間中。 也許這是你應該使用using namespace std;的少數合法情況之一using namespace std; :-)

我沒有看到任何這樣的理由,g ++和gcc只是同一編譯器的不同前端。 因此,對於所有涉及效率,字節兼容性等的內容,混合由兩者生成的.o文件應該沒有問題。

C和C ++有可以使你的麻煩,從東西,如起始許多細微的差別sizeof 'a' beeing不同但sizeof c是相同的(如果c是一個char ),為bool是在一個類型和在宏其他, true的C ++類型bool和C中的int ,C不允許在for中使用static聲明...

即使C和C ++有一個大的交集,如果你把自己限制在兩個社區中被認為是良好的編碼實踐,你很快就會發現交集幾乎是空的。 這涉及指針轉換,使用mallocnew ,復合初始化器與構造函數的分配,可變長度數組與向量類...

只是不要這樣做。 您所需要的只是創建一個適合兩者的漂亮界面。

不, g++gcc不是同一編譯器的兩個不同的前端。

它們是兩個不同的驅動程序 ,兩個不同的編譯器( cc1pluscc1 )共享相同的中端和后端代碼(使用GCC構建樹,在gcc/libbackend.a ,用詞不當,因為它包含兩個中端(中端是GCC的共同部分,C,C ++,Ada,Fortran,Objective-C,...以及許多目標機器共同;它是GCC的最大部分,並且在一組通用的內部表示上工作,值得注意的是Gimple)和后端(GCC將Gimple表示轉換為匯編的部分,使用RTL -a依賴於目標的內部表示)。

但是cc1和cc1plus有不同的前端代碼。

暫無
暫無

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

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