2011-08-12 16 views
9

मेरे पास एक प्रोजेक्ट है जिसमें टेम्पलेट्स का भारी उपयोग करने वाले कुछ प्रदर्शन संवेदनशील देशी सी ++ शीर्षलेख शामिल हैं। इस प्रोजेक्ट के लिए हम हेडर को भी लपेटते हैं और सी # और अन्य .NET भाषाओं में कार्यक्षमता का पर्दाफाश करने के लिए कुछ गोंद कोड जोड़ते हैं। हम इस हेडर को "layout.h" कहते हैं, और हम मान लेंगे कि यह एक तृतीय पक्ष शीर्षलेख है जिसे मैं नहीं बदल सकता।क्या यह पता लगाने का कोई तरीका है कि #pragma अप्रबंधित C++/CLI में प्रभावी है या नहीं?

मिश्रित मोड में सी ++/सीएलआई असेंबली में गलती करना अपेक्षाकृत आसान है और #pragma अप्रबंधित (#pramga प्रबंधित (पुश, ऑफ)) कोड में किसी स्थान से शामिल है। जब ऐसा होता है तो टेम्पलेट आईएल उत्पन्न करते हैं, और मुझे कोड चलाने और निष्पादन के दौरान अतिरिक्त प्रबंधित/अप्रबंधित संक्रमण मिलते हैं।

मेरा सवाल यह है कि क्या मैं एक तरीका है जिसमें मैं # शामिल होने से ठीक पहले संकलन-समय की जांच कर सकता हूं ताकि संकलन विफल हो जाए यदि मैं गलत संदर्भ से # गलती से हूं।

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr 
    ASSERT_UNMANAGED() 
    #include <layout.h> 

मेरे अनुभवहीन 1 प्रयास _MANAGED #ifdef जाँच की है, लेकिन वह हमेशा परिभाषित किया गया है कि क्या मैं कोड या नहीं की #pragma अप्रबंधित ब्लॉक में हूँ।

+0

+1: दिलचस्प सवाल। – leppie

+0

यह वास्तव में एक कठिन है। मैं 'ASSERT_MANAGED' को लागू करने के लिए एक दर्जन विभिन्न तरीकों के बारे में सोच सकता हूं, लेकिन' ASSERT_UNMANAGED' ने मुझे स्टंप कर दिया है। – ildjarn

+0

बस किसी को देखने के लिए, _MANAGED, __CLR_VER, और __cplusplus_cli #pragma प्रबंधित/#pragma ummanaged द्वारा अप्रभावित हैं, वहां स्कॉप्स पूरी संकलन इकाई हैं। –

उत्तर

1

आप ASSERT_MANAGED या ASSERT_UNMANAGED कोड लिख सकते हैं जो कि प्रबंधित या अप्रबंधित संकलन के दौरान उपलब्ध निर्माण का उपयोग करेगा। एक ref class घोषणा एक उदाहरण है जो प्रबंधित होने पर ही उपलब्ध है।

यह कुछ हद तक गंदा समाधान है, लेकिन यह काम करेगा।

+1

तो रेफ क्लास घोषणाएं - एक ASSERT_MANAGED() लिखते समय काम करें। यह चाल कानूनी सी ++ को खोजने के लिए है जो ASSERT_UNMANAGED() ब्लॉक –

+2

लिखने में सक्षम करने के लिए कानूनी सी ++/सीएलआई नहीं है, एक और निकटतम प्रतियोगी लगातार स्ट्रिंग कॉन्सटेनेशन का उपयोग कर रहा है, अगर यह काम करता है तो यह सीएलआई कोड (सिस्टम :: स्ट्रिंग) है, अन्यथा यह मूल है कोड। मैं अभी भी इसमें और अधिक जांच कर रहा हूँ! – Ajay

+0

मैंने शून्य __fastcall foo() के बारे में सोचा; वास्तव में काम नहीं करता है, वहाँ एक कंपाइलर बग का थोड़ा सा। –

1

प्रज्ञा निर्देश सीधे फ़ाइल में शामिल किया जाना चाहिए। इस तरह, हर जगह आप फ़ाइल को एक अप्रबंधित खंड घोषित करते हैं।

क्षमा करें कि आपको अपनी शामिल फ़ाइल को संशोधित करना होगा।

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

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