C ++ / CX และ C ++ / CLI คืออะไรและเกี่ยวข้องกับ C ++ และ WinRT อย่างไร


31

ฉันกำลังพิจารณาที่จะท้าทายการเรียนรู้ C ++ สำหรับการออกแบบแอพ Metro และนั่นคือตอนที่ฉันเจอ C ++ / CX

แอพ Metro สามารถใช้รหัสใน C ++ 11 ได้หรือไม่? พวกเขาต้องการให้ C ++ / CX ทำงานหรือไม่ แล้ว C ++ / CX คืออะไร? เป็นไปได้หรือไม่ที่จะสร้างแอพ Metro โดยใช้ C ++ หรือจำเป็นต้องใช้ C ++ / CX? นอกจากนี้ C ++ / CLI ยังผูกกับภาพนี้อย่างไร


นอกจากนี้ยังมีการใช้ C ++ / CX ในขณะนี้ (แนะนำให้ใช้ C ++ / WinRT) ดูเอกสาร
SWdV

คำตอบ:


28

Microsoft เคยสร้างระบบ C ++ ที่ให้คุณเข้าถึง Windows API (เรียกว่า win32) จากนั้นวันหนึ่งพวกเขาคิดค้น. NET และคิดว่าทุกอย่างต้องเปลี่ยน

ดังนั้นพวกเขาจึงสร้าง "ส่วนต่อขยายที่จัดการสำหรับ C ++" ซึ่งโดยทั่วไปคือ C ++ แต่มีส่วนขยายที่ไม่ได้มาตรฐานโหลดเพิ่มคำหลักที่ต้องการ__gcสนับสนุนคุณสมบัติ. NET (เช่นการจัดสรรในฮีป GC แทนที่จะเป็นแบบดั้งเดิม)

แต่คนไม่ชอบสิ่งนี้เพราะมันไม่ได้จริง ๆ c ++ มีคำหลักพิเศษทั้งหมดดังนั้น Microsoft จึงออกแบบใหม่และเรียกมันว่า C ++ / CLI ซึ่งมีชุดคำหลักเพิ่มเติมที่เล็กกว่ามาก แต่มีการเปลี่ยนแปลงทางไวยากรณ์เช่น^(ซึ่งก็คือ การอ้างอิง 'ตัวชี้' ไปยังวัตถุ. NET บนฮีป GC)

ไม่กี่ปีต่อมาและ Microsoft ได้ตระหนักว่า. NET ไม่ได้เป็น bullet Silver ที่พวกเขาบอกว่ามันเป็นและพวกเขายังผสาน Windows และทีมพัฒนา Developer เข้าด้วยกัน ส่วนหนึ่งของการประเมินใหม่นี้นำไปสู่การสร้าง Windows API ใหม่ที่เรียกว่า WinRT ซึ่งเป็นโค้ดเนทีฟทั้งหมดและนี่หมายความว่าส่วนขยายเก่านั้นไม่มีประโยชน์อีกต่อไปดังนั้น Microsoft จึงพัฒนาส่วนขยาย C ++ เป็นส่วนหนึ่งที่ทำงานกับใหม่ WinRT API ง่ายขึ้น - โดยเก็บนามสกุลบางส่วนจาก C ++ / CLI (เช่น ^)

ถ้าอย่างนั้นคุณก็ไปอีกรุ่นที่แตกต่างกันของ C ++ แบบขยายนั่นคือ C ++ แบบผิวเผิน อย่างน้อยรุ่นล่าสุดคือรหัสเนทีฟอีกครั้งดังนั้นคุณไม่จำเป็นต้องใช้ส่วนขยายหากคุณไม่ต้องการเพราะคุณสามารถเข้าถึง API ได้โดยตรง (เรียกว่า WRL และเหมือนกับคลาสเทมเพลต ATL รุ่นเก่า)

หากคุณคิดว่าคุณกำลังเข้ารหัสรหัสข้ามแพลตฟอร์มคุณไม่ต้องการคุณสามารถเปลี่ยนการเรียก API แต่คุณไม่สามารถใช้งาน^คอมไพเลอร์อื่นที่ไม่ใช่ Visual C ++ ฉันขอแนะนำให้ใช้ WRL API และทำให้รหัสของคุณเป็นมาตรฐานที่สุดเท่าที่จะทำได้เนื่องจาก 'รหัสพิเศษ' ที่คุณต้องเขียนเปรียบเทียบกับ C ++ / CX นั้นไม่ค่อยดีนัก


หมายเหตุ: C ++ / CX ไม่ได้พูดถึงจนกระทั่งสิ้นสุด มันจะดีที่จะพูดอย่างชัดเจนซึ่งเป็นหนึ่งในวรรคของมัน
โอ๊ก

11

อ้างถึงhttp://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . ในขณะที่ C ++ / CX นั้นมีลักษณะคล้ายกับ C ++ / CLI และมีลักษณะเกือบจะเหมือนกันในหลาย ๆ ทาง แต่ก็มีความแตกต่างทางความหมาย รหัส C ++ / CX เป็นรหัสเนทิฟไม่จำเป็นต้องใช้ CLR การเขียนโปรแกรมใน C ++ / CLI อาจเป็นเรื่องที่ท้าทายอย่างมากเนื่องจากเราต้องใช้โมเดลวัตถุที่แตกต่างกันสองแบบในเวลาเดียวกัน: โมเดลวัตถุ C ++ พร้อมอายุการใช้งานของวัตถุที่กำหนดขึ้นและโมเดลวัตถุ CLI ที่รวบรวมขยะ C ++ / CX นั้นใช้งานได้ง่ายกว่ามากเพราะ Windows Runtime ซึ่งใช้ COM เป็นตัวแมปภาษา C ++ ได้ดีมาก

Windows Runtime กำหนด Application Binary Interface (ABI) ที่ค่อนข้างง่ายและอยู่ในระดับต่ำและกำหนดว่าคอมโพเนนต์กำหนดประเภทของตนโดยใช้รูปแบบเมทาดาทาทั่วไป ไม่ต้องใช้ C ++ / CX อย่างเคร่งครัดในการเขียนส่วนประกอบ Windows Runtime ดั้งเดิม: เป็นไปได้ค่อนข้างมากในการเขียนคอมโพเนนต์ Windows Runtime โดยใช้ C ++ โดยไม่ต้องใช้ส่วนขยายภาษา C ++ / CX และ Visual C ++ 2012 มีไลบรารีไลบรารีเทมเพลต Windows Runtime C ++ WRL) เพื่อช่วยทำให้ง่ายขึ้น คอมโพเนนต์ Windows Runtime จำนวนมากที่จัดส่งเป็นส่วนหนึ่งของ Windows (ใน Windows namespace) เขียนด้วย WRL ไม่มีความมหัศจรรย์ใน C ++ / CX: มันแค่เขียนส่วนประกอบของ Windows Runtime ใน C ++ มากง่ายกว่าและช่วยลดจำนวนของรหัสซ้ำ ๆ และ verbose code ที่คุณต้องเขียนเมื่อใช้โซลูชันไลบรารีที่ใช้เช่น WRL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.