5

लिनक्स पर विशेष रूप से g ++ का उपयोग करके, यह निर्धारित करने का कोई तरीका है कि किसी विशेष कथन के लिए कौन से अधिभारित या टेम्पलेट फ़ंक्शन को चुना गया था?संकलक मुझे बता सकता है कि किस अधिभारित या टेम्पलेट फ़ंक्शन ने इसे चुना है?

अधिक विशेष रूप से, मुझे नहीं लगता कि मुझे जरूरी सभी संभावित विकल्पों को पता है, जो विभिन्न पुस्तकालयों से आने वाली हेडर फाइलों में हो सकती हैं। और अगर मैंने किया, तो मुझे नहीं लगता कि मैं प्रासंगिक कोड को संशोधित कर सकता हूं।

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code उपयोगी हो सकता है - यानी, मध्यवर्ती कंपाइलर चरणों को देखें। अगर आप केवल एक बार ऐसा करना चाहते हैं, आप जेनरेट की गई ऑब्जेक्ट फाइलों को देख सकते हैं, और शायद उस कॉल के आस-पास एक "मार्कर" फ़ंक्शन कॉल चिपका सकते हैं जिसे आप समझना चाहते हैं। ऑब्जेक्ट फ़ाइल इंगित करेगी कि फ़ंक्शन का प्रतीक नाम क्या कहलाता है, जिसे फ़ंक्शन हस्ताक्षर (जिसे अद्वितीय होना चाहिए) में वापस सम्मानित किया जा सकता है जिसे आपने बुलाया था। – Yakk

+5

मैंने अक्सर कहा है कि हमें एक संकलन-समय डीबगर की आवश्यकता है ताकि आप टेम्पलेट इंस्टॉलेशन के माध्यम से मूल्यांकन कर सकें क्योंकि उनका मूल्यांकन किया जा रहा है, टेम्पलेट तर्कों को देखकर, यह देखने के लिए कि वास्तव में क्या चल रहा है। –

+0

जब आप कहते हैं * देखें *, आपका क्या मतलब है? क्लैंग सी ++ के लिए पूरी तरह से गठित एएसटी बनाने के लिए कुख्यात है, हालांकि आपको "पुस्तकालय" में सक्षम होने के लिए अपने पुस्तकालयों के चारों ओर एक कार्यक्रम लिखना होगा। –

उत्तर

1

मुझे यह सीधे करने का कोई तरीका नहीं पता है।

सबसे आसान समाधान कॉल साइट पर ब्रेकपॉइंट सेट करना और जो भी फ़ंक्शन कहा जाता है, एकल चरण में सेट करना है; आपका डीबगर तब आपको बता सकता है कि आप किस फ़ंक्शन में हैं।

Eclipse CDT जैसे आईडीई ओवरलोड और टेम्पलेट रिज़ॉल्यूशन स्वयं (यदि सब कुछ सही काम करता है) कर सकता है, तो फ़ंक्शन कॉल पर राइट-क्लिक करके और फ़ंक्शन घोषणा पर जाकर आपको उचित कार्य में ले जाएं।

जानबूझकर एक अस्पष्ट कार्य कॉल बनाकर, जैसा कि this answer में वर्णित है, आप सभी उपलब्ध अधिभार और टेम्पलेट्स की एक सूची प्राप्त कर सकते हैं और शायद यह पता लगा सकते हैं कि वहां से कौन सा आह्वान किया जा रहा है।

मैथ्यू एम ने कहा, क्लैंग dump its AST कर सकते हैं। इसके लिए कुछ व्याख्या की आवश्यकता है, लेकिन यह आपको यह जानने में मदद कर सकता है कि कौन सा फ़ंक्शन कॉल किया जा रहा है।

+0

धन्यवाद। यदि एक्लिप्स वास्तव में ऐसा कर सकता है तो मैं प्रभावित हूं और यह एक अच्छा समाधान होगा। –

+0

@ सी-urchin - ग्रहण प्राप्त करना विभिन्न स्रोतों और शीर्षलेख फ़ाइलों को सही ढंग से पहचानने के लिए मुश्किल हो सकता है, और विशेष रूप से जटिल C++ कोड शायद ही कभी इसे भ्रमित कर सकता है, लेकिन यह काम करने के बाद यह बहुत अच्छा है। –

+0

@ सी-urchin - एमएस वीएस भी यह कर सकते हैं। माउस कर्सर को फ़ंक्शन के नाम पर ले जाएं और आप ओवरलोड फ़ंक्शन कॉलिंग और ओवरलोड फ़ंक्शन की संख्या देख सकते हैं। मुझे लगता है कि किसी भी आधुनिक आईडीई को यह करना चाहिए। – SergV

1

आंशिक उत्तर।

आप रन-टाइम (Macro/keyword which can be used to print out method name?

GNU सी के लिए ++ में समारोह के नाम पर मुद्रण के लिए गैर मानक मैक्रो का उपयोग कर सकते हैं:

इस कोड ( http://ideone.com/PI39qK) से
#include <iostream> 
using namespace std; 
template <typename T> 
void f(const T & t) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(const string &) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(int) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
int main() 
{ 
    f(1.0); 
    f(1); 
    f(string("sss")); 
    string a; 
    f(a); 
} 

आउटपुट:

void f(int) 
void f(int) 
void f(const std::string&) 
void f(T&) [with T = std::string] 
+0

धन्यवाद, लेकिन जैसा कि मैंने कहा है कि मैं यह नहीं मान सकता कि मैं स्रोत कोड को संशोधित कर सकता हूं या मुझे यह भी पता है कि कौन सा कोड उम्मीदवार हो सकता है क्योंकि यह किसी भी # शामिल फ़ाइल (किसी भी स्तर पर) से आ सकता है। –