2011-10-14 20 views
6

में मैं डिबगिंग (लॉगिंग) के दौरान प्रदर्शन सदस्यों के मान के लिए एक मैक्रो वैरिएबल नाम का उपयोग कर कंसोल पर प्रिंट करने का प्रयास कर रहा हूं। यह कैसे करें? मैंने निम्नलिखित की कोशिश की लेकिन यह काम नहीं करता है।प्रिंट वैरिएबल नाम #define

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl; 

int main(){ 
    int my_variable=3; 
    MY_PRINT(my_variable); 
    // I would like to print to console 
    // 'my_variable'=3 
} 
+2

परिभाषित करें "यह काम नहीं करता है"। मुझे यह कहना है कि अतीत में आपसे कई बार, साथ ही, जो शर्म की बात है। –

+0

हाय टॉमलेक, कृपया नीचे प्रतिक्रिया देखें। '#' अक्षर –

+2

जोड़ने के लिए पर्याप्त है हां, मुझे पता है कि जवाब स्वयं भी क्या है। लेकिन मैं आपको उचित प्रश्न लिखने में थोड़ा देर से ट्रेन करने की कोशिश कर रहा हूं। –

उत्तर

17

बहुत ... मुझे समाधान मिला।

#define STR(x) #x << '=' << x 

int main() 
{ 
    int i = 1; 
    std::string str("hello"); 
    std::vector<std::string> vec; 
    my_class mc; 

    ... 

    std::cout << STR(i) << std::endl 
      << STR(str) << std::endl 
      << STR(vec) << std::endl 
      << STR(mc) << std::endl; 

    return 0; 
} 

इस तरह संकलक स्ट्रीमिंग का डेटा प्रकार के आधार पर ऑपरेटर चुनता है, इसलिए तुम नहीं:

मैं इस

#define MY_PRINT(x) std::cout << #x"=" << x << std::endl 
2

सी के लिए की तरह मैक्रो लिखना चाहिए ++ मैं इस का उपयोग प्रत्येक के लिए अलग-अलग मैक्रोज़ से परेशान करने की आवश्यकता है, और यह किसी भी std :: ostream पर जा सकता है, न केवल std :: cout। बस अपने डेटा के लिए उपयुक्त स्ट्रीमिंग ऑपरेटर प्रदान करते हैं:

std::ostream operator<<(std::ostream&, const T&); 
std::ostream operator<<(std::ostream&, const std::vector<T>&); 
etc 

लेकिन मैं चाहता हूँ वहाँ था एक टेम्पलेट रास्ता मैक्रो को बदलने के लिए, या कम से कम #x द्वारा प्रदान की चर नाम।

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