2011-07-18 33 views
1

Visual Studio中有一個size and distance specification chart,說我可以做這樣的事情,用H前綴不管printf或者wprintf的指定單字節字符字符串:MinGW的printf的尺寸規格字符^ h

int main() 
{ 
char test[]= "abc"; 
_tprintf(_T("%hs\n"),test); 
} 


但如果我編譯同樣的事情MinGW的gcc和我-Wall得到以下警告:
warning: format '%hs' expects type 'short int *', but argument 2 has type 'char *'

是我在做什麼的accepta在mingw中指定單字節字符串的方法?

感謝

編輯,這個問題已經在公平下面詳細回答。簡短的回答是肯定的,在mingw中指定單字節字符串是一種可接受的方式,並且警告可以被忽略。

回答

2

您還會注意到,在Visual Studio文檔說:

注:與char類型的數據使用時,H和L前綴是微軟擴展。

我認爲這將是更準確的說,「與'c''s'格式說明(大寫或小寫)一起使用時」。

認識到GCC編譯器確實不知道Microsoft的運行時如何處理printf()格式字符串,並且GCC給出的警告是針對它更通常使用的運行時定製的。在使用MinGW進行構建時,使用了Windows提供的Microsoft C運行時,msvcrt.dll(儘管MinGW確實爲某些庫函數提供了替換或包裝)。所以在編譯器認爲printf()格式的字符串和參數printf()之間有些混淆,以及運行時會實際執行什麼。

例如,直到最近,在整數轉換中使用ll來格式化64位int類型在MinGW中將無法正常工作。我不確定是否在'MinGW'支持功能中出現'修正',或者msvcrt.dll已更新爲支持ll修改符(我懷疑msvcrt.dll已更新 - 我必須檢查...)。

總而言之,無論GCC給出關於printf()格式字符串的警告,很可能您需要使用MSVC文檔格式化字符串,因爲它的MS運行時MinGW將會正在使用。如果你不喜歡warngin的生成,你可能需要考慮在你的MinGW構建腳本中添加-Wno-format選項。