3 回答

TA貢獻1833條經驗 獲得超4個贊
型安全的。因此,分配給對象也明確檢查了分配對象的類型(在編譯時)(如果需要,則生成編譯時錯誤)。這樣可以防止運行時內存溢出或將浮點值寫入char對象等。
另一方面,scanf()/ printf()和family依賴程序員獲取正確的格式字符串,并且沒有類型檢查(我相信gcc具有擴展名可以幫助您)。因此,它是許多錯誤的源頭(因為程序員的分析能力不如編譯器[更不用說編譯器比人類更完美了])。
只是為了澄清Colin Jensen的評論。
自上一個標準發布以來,iostream庫一直保持穩定(我忘了實際年份,但大約是10年前)。
澄清Mikael Jansson的評論。
他提到的其他使用格式樣式的語言都有明確的保護措施,以防止C stdio庫可能(在C語言中而不是在所提到的語言中)引起運行時崩潰的危險副作用。
注意:我同意iostream庫有點冗長。但是我愿意忍受冗長的措辭以確保運行時安全。但是我們可以通過使用Boost Format Library減輕冗長。
#include <iostream>
#include <iomanip>
#include <boost/format.hpp>
struct X
{ // this structure reverse engineered from
// example provided by 'Mikael Jansson' in order to make this a running example
char* name;
double mean;
int sample_count;
};
int main()
{
X stats[] = {{"Plop",5.6,2}};
// nonsense output, just to exemplify
// stdio version
fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
stats, stats->name, stats->mean, stats->sample_count);
// iostream
std::cerr << "at " << (void*)stats << "/" << stats->name
<< ": mean value " << std::fixed << std::setprecision(3) << stats->mean
<< " of " << std::setw(4) << std::setfill(' ') << stats->sample_count
<< " samples\n";
// iostream with boost::format
std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")
% stats % stats->name % stats->mean % stats->sample_count;
}

TA貢獻1797條經驗 獲得超4個贊
太冗長了。
考慮iostream構造以執行以下操作(對于scanf同樣):
// nonsense output, just to examplify
fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
stats, stats->name, stats->mean, stats->sample_count);
那將需要類似:
std::cerr << "at " << static_cast<void*>(stats) << "/" << stats->name
<< ": mean value " << std::precision(3) << stats->mean
<< " of " << std::width(4) << std::fill(' ') << stats->sample_count
<< " samples " << std::endl;
字符串格式化是一種情況,在這種情況下,可以并且應該避免面向對象,而傾向于嵌入字符串中的格式化DSL??紤]一下Lisp format,Python的printf樣式格式或PHP,Bash,Perl,Ruby及其字符串內插。
iostream 對于該用例而言,充其量是錯誤的。

TA貢獻1836條經驗 獲得超13個贊
該升壓格式庫提供了printf風格的字符串格式化一個類型安全的,面向對象的替代品,到不從通常的冗長的問題遭受輸入輸出流的補充,由于巧妙地利用運營商%。如果您不喜歡使用iostream的operator <<進行格式化,我建議您考慮使用純C printf。
- 3 回答
- 0 關注
- 540 瀏覽
添加回答
舉報