2015-05-21 12 views
15

पर प्रारंभिक सूची पास करना निम्न प्रोग्राम संकलित में टिप्पणी लाइन क्यों नहीं है?एक मैक्रो

#include <iostream> 
#include <vector> 
using namespace std; 

#define F1(a) 1 

int F2(vector<int>) { return 2; } 

int main() { 
    vector<int> v; 
    v = vector<int>{1,2,3}; 

    cout << F1(v) << endl; 
    //The following line doesn't compile. The error is: 
    //error: macro "F" passed 3 arguments, but takes just 1 
    //cout << F1(vector<int>{1,2,3}) << endl; // <- error! 
    cout << F1(vector<int>({1,2,3})) << endl; 
    cout << F1((vector<int>{1,2,3})) << endl; 

    cout << F2(v) << endl; 
    //The following line compiles fine 
    cout << F2(vector<int>{1,2,3}) << endl; 
    cout << F2(vector<int>({1,2,3})) << endl; 
    cout << F2((vector<int>{1,2,3})) << endl; 

    return 0; 
} 

उत्तर

13

पूर्वप्रक्रमक {} के बारे में initialisation नहीं जानता है। यह अल्पविराम को देखता है और सोचता है कि यह एक नए मैक्रो तर्क की शुरुआत है। और फिर अगला वाला। केवल () ब्रैकेट्स चीजें हैं जिनके बारे में यह पता है।

[C++11: 16.3/11]: बाहर सबसे मिलान कोष्ठकों से घिरा preprocessing टोकन के अनुक्रम समारोह की तरह मैक्रो के लिए तर्कों की सूची बनाता है। सूची के भीतर व्यक्तिगत तर्क कोमा प्रीप्रोकैसिंग टोकन से अलग किया जाता है, लेकिन मिलान करने वाले आंतरिक कोष्ठक के बीच कॉमा प्रीप्रोकैसिंग टोकन तर्क अलग नहीं करते हैं। [..]

+2

[ जीसीसी ऑनलाइन दस्तावेज] (https: //gcc.gnu.o आरजी/ऑनलाइनड/सीपीपी/मैक्रो-Arguments.html) एक अच्छा उदाहरण और स्पष्टीकरण है। –

8

एक मैक्रो एक समारोह नहीं है। यह आपके इनपुट vector<int>{1,2,3} को 3 इनपुट के रूप में व्याख्या करता है, जो vector<int>{1, 2 और 3} हैं। आप इसे (vector<int>{1,2,3}) (जैसा कि आपने पहले ही किया है) अभिव्यक्ति करके इसे बदल सकते हैं।

parantheses में सब कुछ एक अभिव्यक्ति और vector<int>(...) एक (* विशेष सदस्य) समारोह इतना पूर्वप्रक्रमक एक अभिव्यक्ति के रूप में यह देखता है।

+1

मजेदार, कसम खाता हूँ कि मैंने पहले ही कहा है !! ('वेक्टर (...) 'कोई फ़ंक्शन नहीं है।) –

+0

@ लाइट डेमिट - आप थोड़ा तेज़ थे: पी मैंने इसे सही किया। क्या यह अभी है? – Otomo

+1

फिर भी, 'वेक्टर (...)' यहां _not_ फ़ंक्शन कॉल है। हाँ, मुझे पता है ऐसा लगता है कि आप निर्माता को बुला रहे हैं। –

3

एक और वैकल्पिक हल को बदलने के लिए है अपने मैक्रो में एक variadic मैक्रो

#define F1(...) 1 

या एक अधिक सामान्य मामले में,:

#define M(a) a 

में
#define M(...) __VA_ARGS__