2012-05-07 10 views
6

है मैं बजना का उपयोग पेड़ पार करने के लिए सी ++ स्रोत कोड और RecursiveASTVisitor से एक एएसटी का निर्माण करने के।बजना में तय करता है, तो दौरा किया CXXRecordDecl वर्ग, struct या संघ

मैं कक्षा, संरचना या संघ होने पर रिकॉर्ड की एक विज़िट की घोषणा पर निर्णय लेना चाहता हूं। मेरे पास एक ओवरराइड फ़ंक्शन विज़िट CXXRecordDecl (क्लैंग :: CXXRecordDecl) है। इस फ़ंक्शन में मैं कक्षा check any information about CXXRecordDecl कर सकता हूं जो क्लास ऑफ़र करता है, लेकिन मुझे नहीं पता कि थी जानकारी कैसे प्राप्त करें।

क्या कोई मेरी मदद कर सकता है?

उत्तर

8

बस isStruct, isClass, और isUnion सदस्य कार्यों का उपयोग, या getTagKind फोन एक TagKind मूल्य यदि आप चाहें तो कर सकते हैं पर switch मिलता है। वे TagDecl बेस क्लास में हैं।

2

रनटाइम पर, सी ++ कक्षा और संरचना के बीच अंतर नहीं बनाता है, और संघ केवल इस तथ्य से अलग है कि इसके डेटा सदस्य सभी पता स्थान साझा करते हैं।

तो इसे पूरा करने का एकमात्र तरीका आपके वर्ग/संरचना/संघ परिभाषाओं में मेटा डेटा शामिल करना होगा जो आपके लिए महत्वपूर्ण भेदों का समर्थन करता है। उदाहरण के लिए:

typedef enum { class_ct, struct_ct, union_ct } c_type; 

class foo { 
public: 
    c_type whattype() { return class_ct; } 
}; 

struct bar { 
public: 
    c_type whattype() { return struct_ct; } 
}; 

union baz { 
public: 
    c_type whattype() { return union_ct; } 
}; 

// बी

+0

क्या आप वाकई संघों को सदस्य कार्य करने की अनुमति है? – RedX

+1

मानक से: 9.5.2: "एक संघ के सदस्य कार्य (कन्स्ट्रक्टर और विनाशक समेत) हो सकते हैं, लेकिन वर्चुअल (10.3) फ़ंक्शंस नहीं।" मैंने उपर्युक्त कोड का परीक्षण किया है और यह काम करता है। –