2013-12-07 22 views
5

我在學習C++時遇到的第一個問題是,某些編譯器支持itoa函數,但實際上沒有在ANSI-C標準中定義(因此通常被認爲是不好的做法)。爲什麼直到現在,C++中沒有明確包含整數到字符串轉換?

我已經看到了多個解決方案,如使用stringstreamsnprintf,它一直都覺得很迂迴的我,終於在C++ 11有std::to_string這感覺從語言的角度乾淨多了。

但爲什麼需要這麼長時間才能添加更直接的方法?除了一些關於效率的討論之外,我很難找到任何東西,並且沒有理由無意改變標準。有沒有正式說過爲什麼沒有包括這個,或者他們爲什麼最終決定將它添加到C++ 11中?是否有任何關於將此添加到C的未來版本的討論?

+1

那麼,問題的一部分就是動態內存分配。除'malloc','calloc'或'realloc'之外,沒有任何C API爲您分配內存。將整數轉換爲字符串需要在某處寫入字符數組,而C方式則是讓您傳遞一個緩衝區來完成此操作。因此'sprintf'和'snprintf'。另外還有如何格式化等問題。C++從C語言的大部分開始,需要很長時間才能真正克服它。現在,可以通過動態內存管理來編寫整個應用程序,而幾乎不需要調用'new' ...... –

+1

@JoeZ:現在應該期望應用程序不會明確地調用'new',除了它們的停止間隔執行'make_unique'預測C++ 14 ;-)當然會有例外,例如使用自定義智能指針的應用程序。 –

+2

這不是基於意見的,雖然它有點無知。 Konrad或我都不知道確切的理由(但無論如何回答我們所知道的事實)並不意味着沒有理由。這個問題基本上已經被封爲「太難」了。 –

回答

5

事後看來,這是一個疏忽。然而,在不瞭解C++發展歷史的細節的情況下,我猜測這種監督有很好的理由,根源於理論。看到,從數字到字符串的轉換遠不是微不足道的,它不適合「演員」的正常定義(實際上,它需要解析器/格式化器),儘管大多數其他語言也是如此(提供這樣的演員。

除此之外,C++對字符串類型的支持是......行人。 C甚至沒有真正的專用類型,它使用char數組。 C++進一步略爲,但沒有正確的內置字符串支持。這可以從許多方面看出來,從字符串文字仍然是一個以null爲終止的數組,到廣泛的一致認爲std::string有一個膨脹的,設計不佳的界面。並且不要忘記std::string甚至不代表一個字符串!它表示一個字節數組!這是一個重要的區別,原因很簡單,std::string是完全編碼不可知的。

啊,但C++實際上確實支持正確的編碼和正確的解析和格式。它根本不提供字符串 - 它提供了

在那裏,我們有它。 C++沒有適當的字符串類型。相反,它有輸入/輸出流。

2

據我所知,這只是一個問題,你想要有多少種方法來將整數轉換爲10位數字。 C++從C繼承了一個(sprintf)並添加了它自己的operator<<(ostream &, int)。這兩個都比新的to_string更具可配置性,所以我懷疑它在C++ 98/03時並沒有發生它們不足的情況。

從2003年到2011年(一些廣爲人知的勘誤表就是這樣),沒有對C++標準進行任何正式修改,所以C++ 0x花了這麼長時間才花了這麼長時間,原因與to_string無關。 boost::lexical_cast在一定程度上填補了這一空白。

相關問題