2013-01-25 14 views
13

जी ++ संकलक एक ध्वज है कि वृहद विस्तार कोड (ई) का उत्पादन किया है, इसलिए यदि कोई टेम्पलेट इन्स्टेन्शियशन के बाद कार्यक्रम coude देखने पर पहले वास्तविक संकलन जगह लेता है एक तरीका है मैं सोच रहा हूँ?क्या संकलित होने से पहले तत्काल टेम्पलेट्स के साथ सी ++ कोड देखना संभव है (g ++)?

  • एएसटी: सार सिंटेक्स पेड़
  • ABT: सार ट्री

पूर्व बाइंडिंग

+2

बहुत खराब टेम्पलेट इन्स्टेन्शियशन * है वास्तविक संकलन की प्रक्रिया के हिस्से * ... और या तो शुरुआत में एक नहीं, यह बीच वाले चरण में कहीं है। इसके अलावा, टेम्पलेट्स मांग पर तत्काल हैं। – Xeo

+2

मेरे दिमाग के बजाय मूर्खतापूर्ण भाग से टिप्पणी करें: "g ++ -S" का उपयोग करें और जेनरेट किए गए असेंबलर कोड का निरीक्षण करें! –

+1

एफ ए सी है कि वे संकलन प्रक्रिया का एक हिस्सा हैं @Xeo यकीन है के लिए एक समस्या है, लेकिन है कि वे मांग पर instantiated कर रहे हैं मुझे नहीं se करना एक समस्या के रूप में। तत्काल टेम्पलेट्स (मांगे जाने वाले लोगों के लिए) के साथ एक अलग .log फ़ाइल आउटपुट करने के लिए यह (hypothetically) क्यों संभव नहीं होगा? क्या यह टेम्पलेट कोड डीबग करना थोड़ा आसान नहीं होगा? बस पूछना ... – tmaric

उत्तर

7

ठीक है, करीब आप प्राप्त कर सकते हैं संकलक द्वारा उत्पन्न एएसटी/ABT पढ़ने के लिए है वाक्य रचना के दृश्य का प्रतिनिधित्व के रूप में संकलक यह समझता है और बाद में इसी तरह के बाइंडिंग (यानी की संकल्प के बाद यह है कि यहां a वास्तव में चर कि 3 लाइनों से पहले घोषित कर दिया गया है या foo उस हेडर में परिभाषित फ़ंक्शन में correspdonds ...)।

बजना अपने एएसटी ... जो वास्तव ABT, वास्तव में, यह इस क्षण में सुधार किया जा रहा है में है डंप करने के लिए अनुमति देता है; चुपके डेवलपर पूर्वावलोकन:

int Test __attribute__((visibility("default"))); 

int main(int argc, char** argv) { 
    int x __attribute__((aligned(4))) = 5; 
    int y = 2; 
    for (;;) 
    if (x != y++) 
     break; 
    return (x * y); 
} 

enter image description here

आम तौर पर आप को देखना चाहिए कि कैसे टेम्पलेट वहाँ instantiated किया गया था।

नोट: इसे पाने के लिए आप बजना सामने के अंत करने के लिए -ast-dump पास की जरूरत है।

+2

यहां कुंजी, वास्तव में, _no_ है। :) –

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