2009-08-18 123 views
6

爲什麼我得到了下面的代碼:)以下警告微軟_stprintf警告

代碼:

_stprintf(m_szFileNamePath,_T("%s"),strFileName); 

警告C4996: '_swprintf':標準的swprintf已改爲與ISO C符合標準,增加一個額外的字符計數參數。要使用傳統的Microsoft swprintf,請設置_CRT_NON_CONFORMING_SWPRINTFS。

我知道_strprintf是一個宏,如果_UNICODE被定義將評估爲_swprintf否則它將是sprintf。

現在這是什麼_swprintf。有一個函數swprintf,但爲什麼_stprintf求值爲_swprintf而不是swprintf。

b/w _xxx和xxx函數有什麼區別?

編輯:

好有用於_stprintf的Unicode版本,包含哪一個兩個定義?

tchar.h或strsafe.h中的那個?

+0

你是詢問_stprintf或_strprintf,還是什麼?請修改您的問題以保持一致。 – 2009-08-18 13:44:04

+0

我在問_stprintf,那是一個錯字 – akif 2009-08-18 13:49:40

回答

5

http://msdn.microsoft.com/en-us/library/ybk95axf%28VS.80%29.aspx

的swprintf是的sprintf的寬字符版本; swprintf的指針參數是寬字符字符串。檢測swprintf中的編碼錯誤可能與sprintf中的錯誤不同。 swprintf和fwprintf的行爲相同,除了swprintf將輸出寫入字符串而不是寫入FILE類型的目標,並且swprintf需要count參數來指定要寫入的最大字符數。具有_l後綴的這些函數的版本是相同的,只不過它們使用傳入的locale參數而不是當前的線程語言環境。

在Visual C++ 2005中,swprintf符合ISO C標準,該標準要求第二個參數count爲size_t類型。要強制使用舊的非標準行爲,請定義_CRT_NON_CONFORMING_SWPRINTFS。在將來的版本中,舊行爲可能會被刪除,因此應該更改代碼以使用新的一致行爲。

+0

爲什麼它會發出警告呢? – akif 2009-08-18 13:50:11

+3

這個警告沒有解釋嗎?因爲他們改變了行爲。人們通常喜歡知道代碼何時不符合他們的期望。 ;) – jalf 2009-08-18 13:57:46

0

微軟提供了它自己的CRT _swprintf的分機 - 不是(例如)用UNIX

0

微軟(用於?)前綴兼容所沒有的C標準的一部分,否則廣泛可用的非Win32函數與下劃線。

+0

好吧_stprintf的UNICODE版本有兩個定義,哪一個是包含的? tchar.h或strsafe.h中的那個? – akif 2009-08-18 14:23:02

1

也許這樣?

_stprintf(m_szFileNamePath, 256, _T("%s"), strFileName); 
0

這應該工作

int len = swprintf(buf, 100, L"%s", L"Hello world");