2012-04-03 10 views
5

Ive एक बहु मंच परियोजना है कि मैक पर महान संकलित है, लेकिन खिड़कियों पर मेरे सारे swprintf एक% s के साथ कॉल के बजाय एक wchar_t के लिए देख रहे हैं char * मैं इसे गुजर रहा हूँ। पता चला है एम $ सोचा था कि यह विस्तृत चरित्र कार्यों में चार * के अलावा कुछ के लिए% s स्टैंड बनाने के लिए हास्यास्पद हो जाएगी ... http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspxदृश्य स्टूडियो swprintf कर रहा है सब मेरे% s formatters wchar_t चाहते * चार के बजाय *

फिर भी मैं एक रचनात्मक कोडिंग चाल के लिए देख रहा हूँ thats बाकी ifdef डालने की तुलना में बेहतर के आसपास समाप्त होता है हर विस्तृत स्ट्रिंग कॉल

उत्तर

4

Visual Studio 14 CTP1 और बाद में %s को एक संकीर्ण स्ट्रिंग (char*) के रूप में हमेशा इलाज नहीं करेगा जब तक आप _CRT_STDIO_LEGACY_WIDE_SPECIFIERS परिभाषित नहीं करते। इसमें टी लम्बाई संशोधक एक्सटेंशन भी शामिल है जो एमएस को "प्राकृतिक" चौड़ाई कहता है। sprintf लिए %Tschar* है और swprintf%Ts के लिए wchar_t* है।


दृश्य स्टूडियो 13 में और पहले %s/%c समारोह/प्रारूप स्ट्रिंग के प्राकृतिक चौड़ाई और %S/%C को मैप किया है के साथ प्राकृतिक के विपरीत करने के लिए मैप किया गया है:

printf("%c %C %s %S\n", 'a', L'B', "cd", L"EF"); 
wprintf(L"%c %C %s %S\n", L'a', 'B', L"cd", "EF"); 

आप लम्बाई संशोधक का उपयोग कर एक विशिष्ट चौड़ाई को भी बल दे सकता है: %ls, %lc, %ws और %wc हमेशा मतलब wchar_t और %hs और %hc एक हैं लावे char। Win9x के दिनों बनाम WinNT में वापस समारोह की प्राकृतिक चौड़ाई के (VS2003 here और VC6 here (%ws के बारे में सुनिश्चित नहीं हैं के लिए प्रलेखित है और जब यह वास्तव में जोड़ा गया है))

मानचित्रण %s गया था वास्तव में आसान, का उपयोग करके tchar.h header आप एक ही स्रोत से संकीर्ण और व्यापक रिलीज बना सकते हैं। _UNICODE विस्तृत कार्यों के लिए tchar.h मानचित्र में कार्य परिभाषित किया गया है जब और TCHARwchar_t है, अन्यथा संकीर्ण कार्यों उपयोग किया जाता है और TCHARchar है:

_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd")); 

एक ऐसी ही विंडोज एसडीके हेडर फाइल और के द्वारा प्रयोग किया सम्मेलन नहीं है वहां मौजूद कुछ प्रारूप फ़ंक्शंस (wsprintf, wvsprintf, wnsprintf और wvnsprintf) लेकिन उन्हें UNICODE और TEXT और _UNICODE और _T/_TEXT द्वारा नियंत्रित किया जाता है।

1) विंडोज पर एक संकीर्ण स्ट्रिंग परियोजना, शायद नहीं एक अच्छा विचार के रूप में संकलित:

आप शायद विंडोज पर एक बहु मंच परियोजना का काम बनाने के लिए आप पुराने विंडोज compilers समर्थन करना चाहते हैं, तो 3 विकल्प हैं और आपके मामले में swprintf अभी भी% s का इलाज wchar_t * के रूप में करेगा।

2) कस्टम प्रकार का उपयोग इस तरह के प्रकार के समान परिभाषित करता है।ज प्रारूप तार काम करते हैं:

#ifdef _WIN32 
#define PRIs "s" 
#define WPRIs L"hs" 
#else 
#define PRIs "s" 
#define WPRIs L"s" 
#endif 
printf("%" PRIs " World\n", "Hello"); 
wprintf(L"%" WPRIs L" World\n", "Hello"); 

3) swprintf के अपने स्वयं के कस्टम संस्करण बना सकते हैं और दृश्य स्टूडियो 13 और पहले साथ उपयोग करें।

+0

मैं वास्तव में यह सुनिश्चित नहीं करता कि इसका उपयोग कैसे करें, मेरे परीक्षणों में _UNICODE परिभाषित किया गया है या परिभाषित नहीं किया गया है व्यवहार एक ही swprintf% s wchar_t की अपेक्षा करता है और char * नहीं। एमएस एक्सटेंशन के लिए क्या आप जानते हैं कि जीसीसी को इस्तेमाल करने का कोई तरीका है या नहीं? – Medran

+0

क्या आप सुनिश्चित हैं कि आपका पर्यावरण आपके लिए इसे परिभाषित नहीं कर रहा है (वीएस में प्रोजेक्ट सेटिंग्स में)? यदि जीसीसी द्वारा आपका मतलब है मिनजीडब्ल्यू तो हाँ, मिनजीडब्ल्यू एमएस सी रन टाइम का उपयोग कर सकता है, http://stackoverflow.com/questions/6729013/mingw-printf-size- स्पेसिफिकेशन-character-h – Anders

+0

मैक पर कोई gcc देखें ... प्रोजेक्ट सेटिंग्स में आप चरित्र प्रकार को 'परिभाषित नहीं' या 'यूनिकोड का उपयोग करें' या 'मल्टीबाइट का उपयोग करें' के रूप में निर्दिष्ट करते हैं। यदि आप 'परिभाषित नहीं' कहते हैं तो _UNICODE परिभाषित नहीं किया गया है, यदि आप कहते हैं 'यूनिकोड का उपयोग करें' तो _UNICODE परिभाषित किया गया है। – Medran

2

%ls प्रारूप जो हमेशा wchar_t* का मतलब का उपयोग करें।

+0

इसकी नहीं एक wchar_t के साथ इस मुद्दे चार * चार के साथ अपने एक मुद्दा * wchar_t के रूप में देखा जा रहा है के रूप में देखा जा रहा है। इसके अलावा मुझे नहीं लगता कि% ls पुराने दृश्य स्टूडियो पर काम करता है ... धन्यवाद वैसे भी। – Medran

+0

क्षमा करें, मुझे 'char *' निर्दिष्ट करने का एक संगत तरीका नहीं मिला, लेकिन मैंने वास्तव में VS7.1 दस्तावेज़ पर% ls देखा, ताकि यह काफी पीछे हो। – Neil

+0

यूप मैं पुष्टि कर सकता हूं कि% ls कम से कम VS2008 के रूप में काम करता है जो मैं हूं, इसके लिए धन्यवाद। मैंने इसे दस्तावेज़ीकरण में भी पाया और जाहिर है कि मुझे% S के बजाय इसका उपयोग करना चाहिए था, जैसा कि मुझे लगता है कि% S बहुत मानक बात है। लेकिन वास्तव में% s को wchar_t के बराबर बनाने से अधिक गैर मानक हो सकता है। एकमात्र चीज जिसे मैंने सोचा था, मेरे सभी * wprint * को एक रैपर फ़ंक्शन पर रीडायरेक्ट कर रहा है जिसे मैं लिख सकता हूं जो% s को necesary के रूप में बदल देगा। – Medran

संबंधित मुद्दे