2011-06-25 29 views
36

this site पर देखा गया, कोड ब्रांडेड में टिल्ड का उपयोग करके मैक्रो इनोकेशन दिखाता है:मैक्रोज़ में tilde (~) का मतलब क्या है?

HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)) 
//           ^^^ 

इसका क्या अर्थ है/करते हैं? मुझे संदेह है कि यह सिर्फ एक खाली तर्क है, लेकिन मुझे यकीन नहीं है। क्या यह शायद सी (99) के लिए विशिष्ट है जैसे __VA_ARGS__ सी 99 के लिए विशिष्ट है और सी ++ में मौजूद है?

+1

यह एक डमी तर्क – Anycorn

+1

~ बिटवाई पूरक है, जैसा कि आप शायद जानते हैं। ऐसा लगता है कि सिर्फ मेरे लिए प्लेसहोल्डर है। मुझे नहीं लगता कि इसका कोई विशेष अर्थ है। –

उत्तर

28

Boost.Preprocessor की शुरूआत पृष्ठ पर, एक उदाहरण A.4.1.1 क्षैतिज में दी गई है दोहराव

#define TINY_print(z, n, data) data 

#define TINY_size(z, n, unused)         \ 
    template <BOOST_PP_ENUM_PARAMS(n, class T)>     \ 
    struct tiny_size<            \ 
     BOOST_PP_ENUM_PARAMS(n,T)         \ 
     BOOST_PP_COMMA_IF(n)          \ 
     BOOST_PP_ENUM(           \ 
      BOOST_PP_SUB(TINY_MAX_SIZE,n), TINY_print, none)  \ 
    >                \ 
    : mpl::int_<n> {}; 

BOOST_PP_REPEAT(TINY_MAX_SIZE, TINY_size, ~) // Oh! a tilde! 

#undef TINY_size 
#undef TINY_print 

एक व्याख्या नीचे दी गई है:

कोड निर्माण की प्रक्रिया BOOST_PP_REPEAT पर कॉल करके, उच्च-आदेश मैक्रो द्वारा कॉल किया गया है जो बार-बार अपने दूसरे तर्क (TINY_size) नामक मैक्रो को आमंत्रित करता है। पहला तर्क दोहराए गए आमंत्रणों की संख्या निर्दिष्ट करता है, और तीसरा कोई भी डेटा हो सकता है; यह लागू होने वाले मैक्रो के अपरिवर्तित पर पारित किया जाता है। इस मामले में, TINY_size उस डेटा का उपयोग नहीं करता है, इसलिए ~ पास करने का विकल्प मनमाना था। [5]

(जोर मेरा)

और वहाँ टिप्पणी है:

[5]~ एक पूरी तरह से मनमाने ढंग से विकल्प नहीं है। @ और $ दोनों अच्छे विकल्प हो सकते हैं, सिवाय इसके कि वे तकनीकी रूप से बुनियादी चरित्र सेट का हिस्सा नहीं हैं जो सी ++ कार्यान्वयन के लिए आवश्यक हैं। अनदेखा की तरह एक पहचानकर्ता मैक्रो विस्तार के अधीन हो सकता है, जिससे अप्रत्याशित परिणाम सामने आते हैं।

इसलिए, टिल्डे बस एक जगह धारक है क्योंकि एक तर्क आवश्यक है, लेकिन कोई भी आवश्यक नहीं है। चूंकि किसी भी उपयोगकर्ता द्वारा परिभाषित पहचानकर्ता wannabe का विस्तार किया जा सकता है, तो आपको कुछ और उपयोग करने की आवश्यकता है।

ऐसा लगता है कि ~ (बाइनरी निषेध है कि अक्सर कहा जाता है नहीं है) काफी अप्रयुक्त है + या - उदाहरण के लिए की तुलना में है, इसलिए भ्रम की संभावना बहुत कम है।एक बार जब आप इस पर बस जाते हैं, तो इसका उपयोग लगातार नया देता है जिसका अर्थ है टिल्डे; स्ट्रीमिंग डेटा के लिए operator<< और operator>> का उपयोग करने की तरह एक सी ++ मुहावरे बन गया है।

+0

धन्यवाद, यह एक अच्छा खोज है और वास्तव में मुझे क्या चाहिए। :) – Xeo

+0

मेरा +1, यह एक बहुत अच्छा खोज है! मुझे इसके लिए कोई मानक संदर्भ नहीं मिला और इसे पूरी तरह से समझने के लिए संघर्ष कर रहा था। आपका जवाब इसे अच्छी तरह से बाहर करता है। –

+0

मैक्रो विस्तार वास्तव में अप्रत्याशित परिणामों के कारण कैसे हो सकता है, इस पर विचार करते हुए कि तर्क (और इसलिए, मैक्रो-विस्तारित तर्क) TINY_size के विस्तार में प्रकट नहीं होता है? – Random832

3

तर्क का परीक्षण किया जा करने के लिए मैक्रो और उसके कोष्टक बीच रखा गया है, मैक्रो केवल चलाता है अगर तर्क खाली हैं:

_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~) 

नोट: वास्तव में बहुत से लिंक आप पोस्ट यह कहा गया। मैं मानक में इसका संदर्भ जांचूंगा।

+0

अपने नोट पर: हाँ, प्रश्न पोस्ट करने के बाद इसे दोबारा पढ़ने के बाद यह मेरे पास आया ... यह पहली बार नहीं है जब मैंने एक प्रश्न पूछा और कुछ मिनट बाद समाधान दिमाग में आया ... :(साथ ही, आपकी पहली वाक्य किसी भी तरह से सीधे सवाल से संबंधित प्रतीत नहीं होती है। – Xeo

+0

@Xeo: क्षमा करें, मुझे डर है कि मैं एक विस्तृत उत्तर पोस्ट करने के लिए संदर्भ को पर्याप्त रूप से समझ नहीं पाया था, इसलिए केवल ढीले सिरे थे क्यों कि केवल ' ~ 'और मैंने बिना किसी सफलता के मानक के लिए मानक को बरकरार रखा। महान, @Matthieu एम द्वारा खोजें। हालांकि, मैं शांति से सो सकता हूं! –

+0

वैसे भी अपने effor के लिए धन्यवाद। :) – Xeo

4

~ कुछ भी नहीं करता है। उन कोष्ठक के अंदर लगभग कोई भी अन्य सामग्री वही काम करेगी।

इस चाल के lynchpin परीक्षण करने के लिए है कि क्या _TRIGGER_PARENTHESIS__TRIGGER_PARENTHESIS_ __VA_ARGS__ (~) के विस्तार में (~) के बगल में है। किसी भी तरह से, HAS_COMMA(...) अपने तर्कों को या तो 0 या 1 पर फैलाता है।

+0

मुझे आश्चर्य है कि यह कैसे खेलेंगे तर्क है कि एक मैक्रो है .. '_TRIGGER_PARENTHESIS_ MYMACRO (~)'। – Xeo

+0

उन्होंने '(~)' और '(+)' या कुछ और क्यों नहीं उपयोग किया? –

+0

@ जोहान्स: Boost.Preprocessor परिचय पृष्ठ पर एक तर्क प्रदान किया गया है, मैंने नीचे उद्धृत किया है। लक्ष्य एक वैध लेकिन दुर्लभ प्रीप्रोसेसर टोकन का उपयोग करना है। –

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