/ / विजुअल स्टूडियो 2013 में _tprintf के साथ stdint प्रकारों का उपयोग कैसे करें? - सी, दृश्य-स्टूडियो -2013, यूनिकोड

विजुअल स्टूडियो 2013 में _tprintf के साथ stdint प्रकारों का उपयोग कैसे करें? - सी, विजुअल स्टूडियो -2013, यूनिकोड

निम्नलिखित उदाहरण लें:

char* fileName = "C:\windows\system32\kernel32.dll";
uint32_t fileSize = 1163264;
printf("The size of %s is %"PRIu32"n", fileName, fileSize);

सब कुछ ठीक है, अब अगर हम पारदर्शी यूनिकोड समर्थन चाहते हैं tchar.h कोड इस तरह दिखेगा:

TCHAR* fileName = _T("C:\windows\system32\kernel32.dll");
uint32_t fileSize = 1163264;
_tprintf(_T("The size of %s is %")_T(PRIu32)_T("n"), fileName, fileSize);

यह काम करता है अगर यूनिकोड है नहीं परिभाषित। हालाँकि, यदि यूनिकोड को कंपाइलर एबोर्ट्स में निम्न त्रुटि के साथ परिभाषित किया गया है:

error C2308: concatenating mismatched strings
Concatenating wide "The size of %s is %l" with narrow "u"

अब Microsoft के inttypes.h को देख रहा हूँ:

...
#define _PFX_32  "l"
...
#define PRIu32       _PFX_32 "u"

जिसका मतलब है कि _T(PRIu32) उपरोक्त उदाहरण में हल है:

_T("l" "u")

... जो निश्चित रूप से काम नहीं कर सकता है और सही संकलक त्रुटि की व्याख्या करता है।

इस प्रकार मेरा प्रश्न यह है कि Microsoft ने कैसे कल्पना की कि हम उनके inttypes.h का उपयोग _tprintf के साथ परिभाषित करते हैं?

उत्तर:

जवाब के लिए 3 № 1

अनुसार1 वर्तमान सी मानक के लिए, केवल एकवर्ण क्रम (एक स्ट्रिंग के रूप में पढ़ें) को एक एन्कोडिंग उपसर्ग द्वारा उपसर्ग किया जाना चाहिए, और उनमें से बाकी को एक ही उपसर्ग के लिए इलाज किया जाता है, और एक ही स्ट्रिंग में समेट लिया जाता है।

एन्कोडिंग उपसर्ग _T मैक्रो द्वारा निर्धारित किया जाता है। यह कुछ भी नहीं करने के लिए हल करेगा, अगर UNICODE परिभाषित नहीं है, अन्यथा यह पूर्व निर्धारित करेगा L तर्क के लिए।

इसका समाधान यह होगा कि पहले स्ट्रिंग पर _T मैक्रो का उपयोग किया जाए, बाकी हिस्सों पर कोई मैक्रो न हो, और वे समान एन्कोडिंग का उपयोग करेंगे:

_tprintf(_T("The size of %s is %") PRIu32 "n", fileName, fileSize);

लेकिन विज़ुअल स्टूडियो वर्जन आप isn "t C99 कंप्लेंट का उपयोग कर रहे हैं, इसलिए यह सुविधा गायब है। ऐसा लगता है कि यह दृश्य स्टूडियो 2015 में तय किया गया था।

उदाहरण में उसी उपयोग का प्रदर्शन किया गया है2 मानक में।


1 (कोटेड: आईएसओ / आईईसी 9899: 201x 6.4.5 स्ट्रिंग साहित्यिक 5)
अनुवाद चरण 6 में, मल्टीबाइट चरित्रके किसी भी अनुक्रम द्वारा निर्दिष्ट अनुक्रम आसन्न चरित्र और पहचान-उपसर्ग स्ट्रिंग शाब्दिक टोकन एक में समाप्‍त होते हैं एकल मल्टीबाइट चरित्र अनुक्रम। यदि टोकन में से किसी में एक एन्कोडिंग उपसर्ग है, तो जिसके परिणामस्वरूप मल्टीबाइट चरित्र अनुक्रम को एक ही उपसर्ग के रूप में माना जाता है; अन्यथा यह एक चरित्र स्ट्रिंग शाब्दिक के रूप में माना जाता है। चाहे अलग-अलग उपसर्ग व्यापक स्ट्रिंग शाब्दिक टोकन समेटे जा सकते हैं और, यदि हां, तो परिणामी मल्टीबैट चरित्र का उपचार अनुक्रम कार्यान्वयन-परिभाषित हैं।

2 (से उद्धृत: आईएसओ / आईईसी 9899: 201x 7.8.1 प्रारूप विनिर्देशक 7 के लिए मैक्रोज़)
wprintf(L"The largest integer value is %020" PRIxMAX "n", i);