2016-09-25 24 views
9

इस सप्ताह की शुरुआत में, केनी केर presented C++/WinRT at CppCon 2016 । यह Modern पर आधारित विंडोज रनटाइम के लिए एक मानक सी ++ प्रक्षेपण है।क्या एक ही प्रोजेक्ट में सी ++/सीएक्स और सी ++/विनआरटी का उपयोग किया जा सकता है?

जहां तक ​​मैं समझता हूँ, C++/CX संकलक/पूर्वप्रक्रमक/कोड जनरेटर स्पर्श नहीं करता स्टैंडर्ड सी ++ कोड, और सी ++/WinRT एक मानक सी ++ पुस्तकालय यह मेरी भोली व्याख्या है होने के साथ, कि दोनों सी ++/सीएक्स और सी ++/उसी परियोजना में WinRT का उपयोग किया जा सकता है।

सवाल:

  • सबसे पहली बात: मेरी भोली व्याख्या सही है?
  • यदि हां, तो क्या एक ही संकलन इकाई में सी ++/सीएक्स और सी ++/विनआरटी का उपयोग किया जा सकता है?
  • सी ++/सीएक्स और सी ++/विनआरटी मिश्रित होने पर क्या ग्रैन्युलरिटी हो सकती है, अगर वे एक ही संकलन इकाई में नहीं रह सकते हैं?
  • क्या सी ++/विनआरटी उसी परियोजना में सी ++/सीएक्स के साथ लागू प्रकारों का उपभोग कर सकता है? (मैं, इस मुश्किल होने की उम्मीद के बाद से सी ++/WinRT संकलक .winmd मेटाडाटा से हेडर उत्पन्न करने के लिए की जरूरत है, तो वहाँ (पूर्व) संकलक उत्पादन पर निर्भरता है।)

मामले यह मायने रखता है में, उन प्रश्नों के उत्तर मुझे भविष्य में मेरी सी ++/सीएक्स परियोजनाओं को कैसे स्थानांतरित करने के बारे में निर्णय लेने की अनुमति देते हैं।


Embracing Standard C++ for the Windows Runtime (on YouTube)

+0

एचएमए, हमें देखना होगा कि वह पिछले वर्ष क्या कर रहा है, उसने अपने जीथब डिपॉजिटरी को अद्यतन नहीं रखा है। यदि आपके पास पहले कभी डब्लूआरएल में डुबकी लगाने का कोई अच्छा कारण नहीं था, तो यह संभावना नहीं है कि सी ++/विनआरटी किसी भी प्रोपेलर्स को स्पिन करने जा रहा है। वास्तव में यह वास्तव में क्या है, कम से कम आधुनिक सीपीपी स्वाद, WRL जैसे एक और रैपर लेकिन सी ++ 1xyz के लिए अपडेट किया गया। केर और मैकनेलिस का कोड मेरे सिर को चोट पहुंचाता है, आप यह देख सकते हैं कि यह क्या करता है लेकिन आसानी से नहीं देखता कि यह क्या नहीं करता है। –

+0

@ हंसपैसेंट: सी ++/विनआरटी (सी ++/सीएक्स से अधिक) का मुख्य कारण प्रदर्शन होगा। संकलन के समय बहुत अच्छे नहीं हैं, और आमतौर पर त्रुटि संदेश अच्छी पहेलियों हैं। फिर भी, मुझे स्पष्ट WRL आमंत्रणों से अधिक संक्षिप्त (या अधिकतर terse, अगर आप चाहें) वाक्यविन्यास पसंद करते हैं (मैं अपना दिमाग बदल सकता हूं, पहली बार मुझे वास्तविक समस्या को डीबग करना होगा)। मैं सहमत हूं, यह देखना मुश्किल है, कौन सा कोड करता है (या नहीं करता)। लेकिन यह सी #/नेट के लिए उतना ही सही है, और यह कभी भी वहां कई लोगों के लिए पसंदीदा लक्ष्य बनाने के रास्ते में नहीं था। वैसे भी, व्यक्तिगत वरीयता व्यक्तिगत है, मुझे लगता है;) – IInspectable

+0

मैं एक सी ++ विशेषज्ञ नहीं हूं, लेकिन ... क्यों नहीं? सी ++/सीएक्स परियोजनाओं में नियमित सी ++ कोड हो सकता है और सी ++/विनरेट नियमित सी ++ है, है ना? –

उत्तर

2

प्रश्न के संबंध में "क्या सी ++/विनआरटी उसी परियोजना में सी ++/सीएक्स के साथ लागू प्रकारों का उपभोग कर सकता है?"

उत्तर हाँ और नहीं है।एक ही प्रोजेक्ट में परिभाषित 'रेफ क्लास' के साथ, इस तरह की एक परियोजना को सी ++/सीएक्स सक्षम के साथ संकलित किया जाना चाहिए, आपका कोड कक्षा का उपयोग कर सकता है क्योंकि यह किसी भी रेफ क्लास को कर सकता है।

हालांकि, यदि आप 'रेफ क्लास' को सी ++/विनरेट प्रोजेक्शन के रूप में उपभोग करना चाहते हैं, तो जवाब प्रभावी ढंग से नहीं है।

सी ++/विनरेट अनुमानित कक्षा परिभाषा प्राप्त करने के लिए, आपको 'रेफ क्लास' के लिए मेटाडेटा पर cppwinrt.exe कंपाइलर चलाने की आवश्यकता है। किसी भी तरह मेटाडेटा प्राप्त करने की आवश्यकता होगी। आप एक बार 'रेफ क्लास' को संकलित करने के लिए कुछ तंत्र को बढ़ा सकते हैं, winmd प्राप्त कर सकते हैं, इसे mmmerge के माध्यम से इसे कैननिकल रूप में रखने के लिए संसाधित कर सकते हैं, अनुमानित कक्षा परिभाषा प्राप्त करने के लिए मेटाडेटा पर cppwinrt.exe चला सकते हैं, फिर जेनरेट किए गए हेडर शामिल कर सकते हैं।

वैकल्पिक रूप से, आप 'रेफ क्लास' का वर्णन करने के लिए आईडीएल लिख सकते हैं, इसे MIDLRT का उपयोग करके मेटाडेटा में संकलित कर सकते हैं, फिर cppwinrt.exe चलाएं। न तो व्यावहारिक आईएमओ है।

सबसे उचित विकल्प केवल सी ++/सीएक्स प्रकार के रूप में रेफ क्लास का उपयोग करता है, क्योंकि परिभाषा एक ही समाधान में है। अगला सबसे व्यावहारिक समाधान कक्षा को एक अलग परियोजना में रखा जाता है, इसे WinMD प्राप्त करने के लिए संकलित करें, फिर winmd से शीर्षलेख बनाएं। यह दृष्टिकोण अलग-अलग परियोजना को भी अनुमति देता है जो सी ++/सीएक्स कोड के उपयोग के बिना 'रेफ क्लास' (प्रक्षेपण के माध्यम से) का उपभोग करता है।

पूरी तरह से पारदर्शी होने के लिए, ध्यान दें कि हमारी प्रारंभिक रिलीज (अब https://github.com/Microsoft/cppwinrt पर उपलब्ध है) में cppwinrt.exe संकलक शामिल नहीं है। इसके बजाय, इसमें C++/WinRT शीर्षलेख फ़ाइलें शामिल हैं जिनमें Windows 10 वर्षगांठ अद्यतन एसडीके में परिभाषित सभी विंडोज रनटाइम प्रकार/एपीआई के लिए अनुमान शामिल हैं - इसमें यूनिवर्सल प्लेटफ़ॉर्म एपीआई और सभी एक्सटेंशन एसडीके एपीआई शामिल हैं।

+0

यह एक अच्छा सारांश है, इसके लिए धन्यवाद। यह काफी पसंद है जिस तरह से मैंने यह पता लगाया था। सिवाय, मैं पूरी तरह से (अब स्पष्ट) तथ्य को याद करता हूं, कि आप सी ++/सीएक्स भाषा एक्सटेंशन का उपयोग करके मानक सी ++ कोड (जैसे सी ++/विनआरटी) में आसानी से 'रेफ क्लास' का उपभोग कर सकते हैं। और जब आप इसके प्रति संकेत देते थे: कितनी जल्दी * "जल्द" * होगा? ऐसा लगता है कि मैं इस साल एक साल से भी ज्यादा समय तक सो रहा हूं। कंपाइलर को आगे नहीं रखना एक लेट-डाउन है, भले ही मैं समझता हूं कि आपको इसे पहली बार सही तरीके से प्राप्त करने की आवश्यकता है। – IInspectable

+0

सी ++/सीएनएक्स प्रकारों के लिए सी ++/सीएक्स प्रकारों का उपभोग करने के लिए अब https://gist.github.com/kennykerr/105f96d61f51b5773670844edec99d85 लागू करने का प्रयास करें। :) –

10

संक्षिप्त उत्तर यह है कि हाँ सी ++/सीएक्स और C++/WinRT उसी प्रोजेक्ट के भीतर उपयोग किया जा सकता है।

सी ++/सीएक्स कंपाइलर Winmd प्रकारों को रूट नेमस्पेस में इंजेक्ट करता है। सी ++/विनआरटी सी ++/सीएक्स के साथ इंटरऑप को समायोजित करने के लिए अपने रूट रूट Winrt नेमस्पेस के अंदर सबकुछ लपेटता है और अन्य पुस्तकालयों के साथ सी ++ कंपाइलर अस्पष्टता त्रुटियों से बचता है। तो निम्नलिखित सी ++/CX कोड:

using namespace Windows::Foundation; 
using namespace Windows::Networking; 

Uri^uri = ref new Uri(L"https://moderncpp.com/"); 
HostName^name = ref new HostName(L"moderncpp.com"); 

इस प्रकार सी ++/WinRT साथ फिर से लिखा जा सकता है:

using namespace winrt; 
using namespace Windows::Foundation; 
using namespace Windows::Networking; 

Uri uri(L"https://moderncpp.com/"); 
HostName name(L"moderncpp.com"); 

वैकल्पिक रूप से, अगर आप/ZW साथ संकलित कर रहे हैं तो आप इसके पुनर्लेखन इस प्रकार हो सकता है ('विंडोज': अस्पष्ट प्रतीक):

using namespace winrt::Windows::Foundation; 
using namespace winrt::Windows::Networking; 

Uri uri(L"https://moderncpp.com/"); 
HostName name(L"moderncpp.com"); 

एक और तरीका है कि आप दोनों सी ++/CX गठबंधन हो सकता है और एक ही स्रोत फ़ाइल में सी ++/WinRT दोनों के लिए एक रूट नाम स्थान का उपयोग करने के इस प्रकार है: त्रुटि C2872 से बचने के लिए

namespace cx 
{ 
    using namespace Windows::Foundation; 
    using namespace Windows::Networking; 
} 

namespace winrt 
{ 
    using namespace Windows::Foundation; 
    using namespace Windows::Networking; 
} 

void Sample() 
{ 
    cx::Uri uri(L"https://moderncpp.com/"); 
    winrt::HostName name(L"moderncpp.com"); 
} 

दिन के अंत में, सी ++/विनरेट केवल एक मानक सी ++ लाइब्रेरी है जिसे आप किसी भी लागू सी ++ प्रोजेक्ट में शामिल कर सकते हैं। सी ++/सीएक्स और सी ++/विनआरटी हालांकि मेटाडेटा से बहुत अलग तरीके से निपटते हैं। सी ++/सीएक्स दोनों उपभोग करता है और सीधे मेटाडेटा उत्पन्न करता है जबकि सी ++/विनआरटी मानक सी ++ द्वारा बाधित होता है और इस प्रकार उस अंतर को ब्रिजिंग में सहायता के लिए एक स्टैंडअलोन टूल (cppwinrt.exe) की आवश्यकता होती है।

+0

उत्तर देने के लिए बहुत बहुत धन्यवाद। तो स्रोत स्तर पर, सी ++/सीएक्स और सी ++/विनआरटी दोनों एक ही संकलन इकाई में खुशी से सह-अस्तित्व में रह सकते हैं। विषम टूलिंग, हालांकि, अलग होने की आवश्यकता हो सकती है (जब उपभोक्ता और उत्पादक विभिन्न भाषा अनुमानों में रहते हैं)। एक विवरण मुझे स्पष्ट नहीं है, यद्यपि: cppwinrt.exe * C++/WinRT स्रोत या ऑब्जेक्ट कोड से .winmd मेटाडेटा निकालें? या अन्य भाषा अनुमानों द्वारा खपत के लिए सी ++/विनआरटी कार्यान्वयन प्रकाशित करने के लिए अतिरिक्त आवश्यकताएं (जैसे एमआईडीएल फाइलें) हैं? – IInspectable

+0

वे सह-अस्तित्व में रह सकते हैं, लेकिन यह ध्यान दिया जाना चाहिए कि कुछ विशिष्ट सिस्टम/उपयोगिता शीर्षलेख बिना '/ ZW'' के साथ बनाए गए व्यवहार को बदलते हैं, और कुछ शीर्षकों को इसकी आवश्यकता होती है।इसके परिणामस्वरूप अतिरिक्त कंपाइलर चेतावनियां भी हो सकती हैं जो तब नहीं होती हैं जब आप '+/ZW'' के बिना C++/WinRT का उपयोग कर रहे हों। –

+0

ऐसा लगता है कि ओपी के सवालों के जवाब देने के लिए,/जेडडब्ल्यू एक ही संकलन इकाई में उपस्थित और अनुपस्थित दोनों नहीं हो सकता है। इसलिए, मानक सी ++ संरचनाओं के लिए, एक ही परियोजना में सह-अस्तित्व में सी ++/सीएक्स और सी ++/विनआरटी के लिए सबसे छोटी ग्रैन्युलरिटी एक ही लिंकेज इकाई (उदाहरण के लिए, डीएलएल; EXE) में विभिन्न संकलन इकाइयों में है। लेकिन .NET संरचनाओं के लिए, सह-अस्तित्व का एकमात्र तरीका सी ++/सीएक्स (और सी # एस) और सी ++/विनरेट प्रस्तुतियों के माध्यम से है .NET संरचना- •• बिल्कुल नहीं •• मानक सी ++ डोमेन के माध्यम से दृश्यों के पीछे छोड़कर। – optikos

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