簡體   English   中英

在C ++中使用C功能是不好的做法嗎?

[英]Is it bad practice to use C features in C++?

例如printf而不是coutscanf而不是cin ,使用#define宏等?

我不會說壞,因為這將取決於個人選擇。 我的策略是當C ++中有類型安全的替代品時,使用它們會減少代碼中的錯誤。

這取決於哪些功能。 在C ++中使用define宏是非常不受歡迎的,並且有充分的理由。 您幾乎總是可以使用C ++(模板,內聯函數等)中更易於維護和安全的東西來替換define宏的用法。

另一方面,Streams被一些人正確判斷為非常慢,我已經看到很多有效且高質量的C ++代碼使用C的FILE*而不是其主機。

還有一件事:對於過多的流格式化可能性,對於像簡單的調試打印輸出這樣的東西,恕我直言,你只是無法擊敗printf及其格式字符串的簡潔性。

我會說唯一真正有害混合的是malloc / freenew / delete之間的配對。

否則它真的是一種風格的東西......雖然C與C ++兼容,但是當C ++擁有你需要的所有內容而不退縮時,你為什么要混合使用這兩種語言呢?

你絕對應該使用printf代替cout 后者確實允許你創建printf允許的大部分或全部格式化控件,但它以有狀態的方式完成。 即當前格式化模式存儲為(全局)對象的一部分。 這意味着錯誤的代碼可能會使cout處於后續輸出格式錯誤的狀態,除非您每次使用它時都重置所有格式。 它還會對線程使用造成嚴重破壞。

對於大多數情況,有更好的解決方案,但不是全部。

例如,人們經常使用memcpy 我幾乎不會這樣做(除了真正的低級代碼)。 我總是使用std::copy ,甚至是指針。

輸入/輸出例程的計數相同。 但有時候,C風格的printfcout更容易使用(特別是在日志記錄中)。 如果Boost.Format不是一個選項那么肯定,使用C.

#define完全是一個不同的野獸。 它不是真正的C-only功能,在C ++中有許多合法用途。 (但還有更多不是。)

當然你永遠不會用它來定義常量(這就是const的用途),也不是用來聲明內聯函數(使用inline和模板!)。

另一方面,生成調試斷言並且通常作為代碼生成工具通常是有用的。 例如,我是單元測試類模板而沒有廣泛使用宏,這將是* ss中真正的痛苦。 在這里使用宏並不好,但它可以節省數千行代碼。

對於分配,我會完全避免使用malloc / free而只是堅持使用new / delete。

不是真的, printf()cout快得多,而且c ++ iostream庫非常大。 這取決於用戶偏好或程序本身(是否需要?等)。 此外, scanf()不再適合使用,我更喜歡fgets()

可以使用或不僅僅取決於將使用的編譯器。 由於您使用c ++編程,在我看來,為了最大化兼容性,最好使用c ++提供的代替c函數,除非您沒有任何其他選擇。

從一個稍微不同的角度來看,我會說在C中使用scanf很糟糕,更別提C ++了。 用戶輸入遠遠不能用scanf來可靠地解析。

我只是發表評論到另一個回復,但因為我不能...因為國際化,C的printf()比C ++的iostream更好。 想要翻譯字符串並將嵌入的數字放在不同的位置? 用ostream做不到。 printf()的格式規范本身就是一個完整的小語言,在運行時解釋。

暫無
暫無

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

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