「_」的含義是什麼?爲什麼微軟在開始時添加了這個標記?爲什麼在msvC++中我們有_snprintf,而其他編譯器允許snprintf
回答
以_
開頭的全局名稱空間中的標識符被保留用於實現。 _snprintf
只是實現(Visual Studio)提供的一個函數。至於其基本原理,Visual Studio實現了C89,而snprintf
是後來的C99標準的一部分。
除此之外,兩種功能的語義是在返回類型,它在snprintf
始終是格式化的字符串採用(是否有在緩衝足夠的空間或沒有,而_snprintf
將返回字符數不同。負數如果沒有在緩衝區足夠的空間
也就是說,分配緩衝區只是足夠大的輸出,你可以這樣做:
int size = snprintf(0, 0, "%s %d\n", str, i);
char * buffer = malloc(size+1);
snprintf(buffer, size+1, "%s %d\n", str, i);
你不能做到這一點與_snprintf
爲上函數返回的信息是當前大小不夠。
snprintf()
還沒有成爲微軟C運行時開始支持它的標準的一部分。
由於函數原型沒有標準化,並且開發人員不想使用名稱snprintf
(以防標準稍後指定了不同的原型),所以他們選擇添加一個前導下劃線來表示該函數爲Microsoft擴展到標準。
添加到上面,
有適當的C99 snprintf()
和vsnprintf()
可用,因爲的Visual Studio 2015年
,他們甚至不觸發衆所周知的不安全功能棄用警告。
_snprintf_s()
或_vsnprintf_s()
,而提供,是的MSVC專用功能「安全變體」,與非C99行爲。
除了在緩衝區不夠大的情況下的不同返回值(在David的回答中描述)之外,來自_sn...
組的功能與標準snprintf
在另一個重要方面有所不同。如果目標緩衝區是一個字符太短,該_sn...
功能考慮這種情況下「成功」。
更詳細地,如果目標緩衝器是足夠長,以在整個得到的序列存儲但沒有終止零字符,所述_sn...
函數不截斷的結果,不寫終止零到目標緩衝器和作爲結果返回緩衝區的大小。所以,通常情況下,結果不能保證以零終止。
在相同的情況下,snprintf
將丟棄所產生的序列的最後一個字符和寫在其位0終結。 snprintf
的結果始終爲零終止。
- 1. 爲什麼編譯器在C++中允許vector.begin()= vector.end()?
- 2. 爲什麼VC++ 2010允許它編譯?
- 3. 爲什麼Visual Studio不允許我編譯這個Bresenham代碼?
- 4. 爲什麼我們需要允許接口只從java.lang.Object中擴展而不是其他類?
- 5. 編譯器允許'char * k = false'?爲什麼?
- 6. 爲什麼編譯器允許縮小轉換範圍
- 7. 爲什麼沒有其他構造函數被允許?
- 8. 爲什麼這個C++代碼會與某些編譯器一起編譯而不是其他編譯器?
- 9. 等價於其他編譯器中MSVC的_countof?
- 10. 異常允許我們分開什麼?
- 11. 爲什麼跨站API調用允許一些API但不允許其他人
- 12. 爲什麼Java編譯器有時會允許對null進行拆箱?
- 13. 爲什麼我們允許在java中擁有最終的主要方法?
- 14. 爲什麼GWT有時會成功編譯,而其他時間只是失速?
- 15. 爲什麼我的代碼在x64中編譯而不是在x32中編譯?
- 16. 爲什麼打字稿編譯犯規允許返回類
- 17. 爲什麼我的comboBox只顯示其中一個值而灰顯,並且不允許它們被選中?
- 18. 爲什麼在MSVC
- 19. 爲什麼我們需要在Java中編譯時間常量?
- 20. 爲什麼MSVC編譯器沒有檢測到std :: array出邊界訪問
- 21. MSVC編譯器行爲是用來
- 22. 從其他fortran編譯器中區分ifort的宏是什麼?
- 23. 什麼是Xcode5中的「其他故事板編譯器標誌」
- 24. MSVC編譯器更新
- 25. MSVC++編譯器錯誤C2892?
- 26. 使MSVC編譯器GCC complient?
- 27. 什麼PHP CMS將允許我有多個級別的用戶可以關注其他用戶併發布在他們的「牆上」。有什麼建議麼?
- 28. 在其他庫中編譯器警告
- 29. Boost 1.37爲MSVC預編譯
- 30. 爲什麼我們在編寫編譯器時需要運行時庫?