2015-02-07 39 views
0

所以我現在正在學C(打算學習C++之後),但我遇到了一些困境。避免混合使用C和C++代碼的做法或方法

  1. 有人不知不覺地將C和C++混合在一起?
  2. 如何避免混合C和C++?
+4

這甚至意味着什麼。 – 2015-02-07 07:09:23

+0

'有人在不知不覺中混合C和C++會有多常見?取決於這個人。 '如何避免C和C++的混合?'又取決於這個人。 – deviantfan 2015-02-07 07:12:18

+1

第一季度答案:從C過渡到C++時非常普遍。 Q2的答案:通過練習,被不好的代碼咬了幾次,從書本和在線資源中學習。 – 2015-02-07 07:12:29

回答

4

的第一件事將是決定你要學習的語言。在學習C++之前學習C是沒有必要的,反之亦然。

徹底地學習你所選擇的語言。很少有母語爲英語的人將德語與英語混合使用,反之亦然。編程語言也是如此 - 如果您熟悉自己選擇的語言,即使它們有相似之處,也不可能將其他語言中的內容混合在一起。而且,隨着時間的推移,你會認識方言。

閱讀C和C++之間的不兼容性。最初的C++標準明確列出了它與前面的標準C(ANSI C89或ISO C90)之間的所有兼容性。關於不兼容性有很多很好的資源可供免費獲得 - 一些專注於C開發人員,一些專注於C++開發人員。

配置您的編譯器(或IDE或構建腳本),以便編譯器能夠檢測您選擇的語言的偏移。還要將其配置爲最大警告級別(幾乎沒有編譯器是以這種方式配置的),並努力使代碼從不會觸發編譯器的最小警告。更好的是,用多個編譯器來做到這一點。

如果沒有上述步驟,下面的經驗法則將會不太有效。畢竟,如果不理解潛在的推理,經驗法則就不太有效。

一些經驗法則,如果使用C開發,避免使用C++特有的特性。

  • 不要使用運營商新的或刪除使用任何標準頭
  • 避免沒有.H擴展名(例如 ,#include <stdio.h>是C,#include <iostream>是C++。
  • 不要使用例外。
  • 不要使用類,使用結構。
  • 不要在結構中指定成員函數。
  • 不要在結構中使用訪問說明符(公共,私有,受保護)
  • 不要重載函數(即不要使用同名的函數但不同的參數列表編寫兩個或多個函數)。
  • 如果您打算使用bool類型(和值truefalse),那麼使用#include <stdbool.h>(C99或更高版本)。
  • 請勿使用模板。
  • 如果某個函數不接受任何參數,則用void參數 列表聲明它。例如,表示該功能不需要參數 。
  • 請勿使用名稱空間。
  • 請勿使用C++風格演員表(const_cast,reinterpret_cast, dynamic_cast, static_cast)。使用普通的C風格的類型轉換(例如 (int *)的東西轉換成一個指針爲int)

一些經驗法則,如果用C++開發,以避免特定於C-功能。

  • 不要使用malloc(),realloc(),calloc()或free()來動態分配內存。
  • 避免使用有.h擴展名(對 例如任何標準的頭,#include <stdio.h>是C,#include <iostream>是C++。讓顯著使用標準庫的C++。
  • 如果您打算使用bool型(和值truefalse), #include <stdbool.h>,這是因爲booltruefalse是在C++中的關鍵字,但宏在標準C.
  • 如果一個函數接受任何參數,不要用它聲明無效論據 名單。
  • 使用命名空間或函數重載來解決您希望具有指定命名方案的多個函數的情況。
  • 不要使用C風格演員,永遠。使用C++風格強制轉換const_cast,reinterpret_cast,dynamic_cast, static_cast)。
+0

母語爲英語的人將兩種語言混合在一起 - 法語 - Summat與諾曼征服 – 2015-02-07 10:08:22

+0

英語本身源自很多語言,Ed。但一位母語爲英語的人會將這些事情看作是英語,而不是混合法語,西班牙語,拉丁語或他們所選詞彙的任何語言。 – Rob 2015-02-07 10:24:01

+0

我知道 - 只是對你的陳述進行觀察。 – 2015-02-07 10:25:20

3

C++在20世紀80年代中期脫離了C,當時它已經獲得了大部分熟悉的功能。它繼續包含最近C99和C11修訂版的功能。 C++與C的交集是一種完全合理且有用的語言。

最近,GCC編譯器項目在驗證他們成千上萬(幾百萬?)的複雜C代碼行真的已經大部分有效的C++後,從C切換到C++。

您可以繼續學習C,不要太習慣於複雜的功能或古怪的技巧,只需在需要更加結構化的東西時切換到調用C++編譯器。

或者,使用C++編譯器一直以來,與-Wall -pedantic選項。有豐富的資源對這樣的便攜性: