[英]Is it bad practice to use C features in C++?
例如printf
而不是cout
, scanf
而不是cin
,使用#define
宏等?
我不會說壞,因為這將取決於個人選擇。 我的策略是當C ++中有類型安全的替代品時,使用它們會減少代碼中的錯誤。
這取決於哪些功能。 在C ++中使用define
宏是非常不受歡迎的,並且有充分的理由。 您幾乎總是可以使用C ++(模板,內聯函數等)中更易於維護和安全的東西來替換define
宏的用法。
另一方面,Streams被一些人正確判斷為非常慢,我已經看到很多有效且高質量的C ++代碼使用C的FILE*
而不是其主機。
還有一件事:對於過多的流格式化可能性,對於像簡單的調試打印輸出這樣的東西,恕我直言,你只是無法擊敗printf
及其格式字符串的簡潔性。
我會說唯一真正有害混合的是malloc
/ free
和new
/ delete
之間的配對。
否則它真的是一種風格的東西......雖然C與C ++兼容,但是當C ++擁有你需要的所有內容而不退縮時,你為什么要混合使用這兩種語言呢?
你絕對應該使用printf
代替cout
。 后者確實允許你創建printf
允許的大部分或全部格式化控件,但它以有狀態的方式完成。 即當前格式化模式存儲為(全局)對象的一部分。 這意味着錯誤的代碼可能會使cout
處於后續輸出格式錯誤的狀態,除非您每次使用它時都重置所有格式。 它還會對線程使用造成嚴重破壞。
對於大多數情況,有更好的解決方案,但不是全部。
例如,人們經常使用memcpy
。 我幾乎不會這樣做(除了真正的低級代碼)。 我總是使用std::copy
,甚至是指針。
輸入/輸出例程的計數相同。 但有時候,C風格的printf
比cout
更容易使用(特別是在日志記錄中)。 如果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.