2012-01-20 7 views
5

मेरे पास बहुत सारे टेम्पलेट कोड हैं। चूंकि खराब टेम्पलेट कोड संकलित होने तक संकलक त्रुटि को फेंक नहीं देता है, क्या कोई तरीका है कि मैं यह जांच सकता हूं कि संकलक वास्तव में 'संकलित' कौन सा टेम्पलेट कार्य करता है और जिसे पूरी तरह से अनदेखा किया गया था?क्या मैं जांच सकता हूं कि कौन से फ़ंक्शन टेम्पलेट्स हैं, या कम से कम एक बार तत्काल नहीं किया गया है?

संपादित करें 2:

तो एक विशेष वर्ग टेम्पलेट या समारोह टेम्पलेट एक बार किसी भी पैरामीटर प्रकार के लिए instantiated है, तो यह उस समय ठीक है। मैं फ़ंक्शन/क्लास टेम्पलेट्स की सूची चाहता हूं जो किसी भी रूप में कभी भी तत्काल नहीं थे।

एक विशेष उदाहरण निम्नलिखित है। वे दो अलग-अलग टेम्पलेट फ़ंक्शंस हैं, और मैं जानना चाहूंगा कि दोनों या दोनों कभी तत्काल नहीं हैं।

template <typename T_InputItr, typename T_Distance> 
void advance(T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag) 

template <typename T_InputItr, typename T_Distance> 
void advance(T_InputItr& aItr, T_Distance aN, random_access_iterator_tag) 

संपादित करें: वर्तमान में, कक्षाओं के लिए, मैं उन्हें .cpp फ़ाइल में दृष्टांत मैन्युअल इस तरह:

template TClass<int>; 
सभी प्रकार मैं में दिलचस्पी के लिए

कि अच्छी तरह से और अच्छा है।। लेकिन अगर मुझे ऐसा करना याद है। कभी-कभी मुझे बहुत से छोटे टेम्पलेट वर्ग/फ़ंक्शन लिखने की आवश्यकता होती है जहां मैं फ़ंक्शन/क्लास टेम्पलेट्स मैन्युअल रूप से कुछ तुरंत चालू करना भूल जाता हूं और बाद में सड़क को नीचे खोजता हूं। मैं संकलक को मुझे बताना चाहता हूं।

वैकल्पिक रूप से, अगर मुझे तत्काल (किसी भी पैरामीटर के लिए) फ़ंक्शन/क्लास टेम्पलेट्स की सूची मिल सकती है, तो मैं उस पूर्ण सूची में इसकी तुलना कर सकता हूं जिसे मैं कोड में grep कर सकता हूं।

एक और लाभ 'टेस्ट' करने के लिए होगा जो एक टेम्पलेट वर्ग में संकलित किए गए थे जो विशिष्ट कार्यों को चुनिंदा रूप से संकलित करने के लिए प्रकार के गुणों का उपयोग करते हैं। मैं निश्चित होना चाहता हूं कि आगे बढ़ने से पहले सही कार्य चुनने के लिए मेरा तर्क सही है।

+0

और यदि आप इसे देख सकते हैं तो आप क्या करेंगे? – Jon

+0

@ जोन: मैं इसे मैन्युअल रूप से डमी प्रकारों से तुरंत चालू करके परीक्षण करता हूं ताकि यह सुनिश्चित किया जा सके कि इसका वाक्यविन्यास सही है, कम से कम उन प्रकारों के लिए जिन्हें मैं जानता हूं। – Samaursa

+0

तो आपका उत्तर है: एक टेस्ट प्रोजेक्ट बनाएं जहां आप * सभी * टेम्पलेट किए गए कार्यों को * सभी * प्रकारों के साथ आमंत्रित करते हैं जिन्हें आप जानते हैं। यदि प्रोजेक्ट संकलित नहीं करता है तो आपको कोई समस्या है। :) – Jon

उत्तर

1

किसी ने उल्लेख किया है कि "सब कुछ अविवेक का एक स्तर जोड़कर हल किया जा सकता है" - आप प्रत्येक कार्य करने के लिए एक स्थिर ज़ोर जोड़ सकते हैं और संकलन देख सकते हैं असफल:

template <typename T> 
struct Asserter 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct Foo 
{ 
    void foo() 
    { 
    static_assert(Asserter<T>::value, "Foo::foo() is being compiled."); 
    } 
    void bar() 
    { 
    static_assert(Asserter<T>::value, "Foo::bar() is being compiled."); 
    } 
}; 

int main() 
{ 
    Foo<int> f; 
    //f.foo(); // static assertion! 
} 

आप नहीं करते संकलन करना चाहते हैं प्रत्येक चरण पर तोड़ें, आप इसके बजाय Boost static warning, या इसी तरह के प्रभाव से कुछ निकाल सकते हैं।

+0

मैं इस समाधान के साथ जा रहा था, मैक्रोज़ के साथ आवेषण लपेटता हूं जो एक निश्चित प्रीप्रोसेसर के साथ कुछ नहीं करता है। – Samaursa

0

आप संकलन के बाद एक स्थैतिक विश्लेषण उपकरण के माध्यम से अपने निष्पादन योग्य को चला सकते हैं बशर्ते आपने उचित कंपाइलर टेबल को शामिल करने के लिए अपना कंपाइलर सेटअप किया हो ... जो सभी तत्काल कक्षाओं को उनके टेम्पलेट तर्कों के साथ दिखाएगा। Here is a link उपकरण की एक सूची में जो स्थिर कोड विश्लेषण के लिए उपयोग किया जा सकता है।

2

यह देखते हुए कि आप एमएसवीसी 2008 का उपयोग कर रहे हैं, आप इसे एक लिंकर मैप फ़ाइल जेनरेट करके और उस समारोह के सभी तत्कालताओं की खोज करके या डीपीए के माध्यम से .pdb का निरीक्षण करके कर सकते हैं। आप लिंकर ध्वज/ओपीटी के साथ COMDAT फोल्डिंग को अक्षम करना चाहते हैं: NOICF ताकि आप एक ही असेंबली को संकलित करने के लिए होने वाले कार्यों को पा सकें।

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