2014-06-19 7 views
55

The official document of CMake 2.8.12 में मैक्रो के बारे में macroसमारोह बनाम CMake

जब यह शुरू हो जाती है कहते हैं, आदेशों मैक्रो में दर्ज की गई पहली औपचारिक पैरामीटर की जगह द्वारा संशोधित ($ {ARG1}) तर्क पारित कर दिया साथ कर रहे हैं, और फिर सामान्य आदेश के रूप में बुलाया।

और के बारे में function

जब यह शुरू हो जाती है, आदेश समारोह में दर्ज की गई पहली औपचारिक पैरामीटर तर्कों पारित कर दिया साथ की जगह ($ {ARG1}) द्वारा संशोधित कर रहे हैं, और उसके बाद के रूप में लागू किया सामान्य आदेश

जाहिर है, दो उद्धरण लगभग समान हैं लेकिन मुझे भ्रमित कर रहे हैं। मैक्रोज़ की तरह फ़ंक्शन को कॉल करते समय पहले पैरामीटर को प्रतिस्थापित करता है?

+6

नहीं है कम से कम एक अन्य महत्वपूर्ण, 'function' और' macro' के बीच काफी स्पष्ट अंतर यद्यपि: 'वापसी की अर्थ विज्ञान()': जब एक 'macro' में प्रयोग किया जाता है, तो आप मैक्रो से वापस नहीं होगा, लेकिन कॉलिंग समारोह से। –

+23

जब आप उन्हें समझने की कोशिश करते हैं तो सीएमके के दस्तावेज भयानक हैं। – stanleyli

उत्तर

59

मैं

set(var "ABC") 

macro(Moo arg) 
    message("arg = ${arg}") 
    set(arg "abc") 
    message("# After change the value of arg.") 
    message("arg = ${arg}") 
endmacro() 
message("=== Call macro ===") 
Moo(${var}) 

function(Foo arg) 
    message("arg = ${arg}") 
    set(arg "abc") 
    message("# After change the value of arg.") 
    message("arg = ${arg}") 
endfunction() 
message("=== Call function ===") 
Foo(${var}) 

नीचे एक नमूना कोड लिखा था और उत्पादन

=== Call macro === 
arg = ABC 
# After change the value of arg. 
arg = ABC 
=== Call function === 
arg = ABC 
# After change the value of arg. 
arg = abc 
तो ऐसा लगता है arg var का मूल्य असाइन किया गया है जब कॉल Foo और ${arg} सिर्फ स्ट्रिंग ${var} जब साथ प्रतिस्थापित कर रहे हैं

है कॉल करें Moo

तो मुझे लगता है, हालांकि सरकारी दस्तावेजों में यह भी कहा

कि वे स्ट्रिंग प्रतिस्थापन बहुत सी पूर्वप्रक्रमक एक मैक्रो के साथ करना होगा की तरह हैं ऊपर दो उद्धरण बहुत एक भ्रमित करने के लिए आसान है। यदि आप सच सीएमके चर और/या बेहतर सीएमके स्कोप नियंत्रण चाहते हैं तो आपको फ़ंक्शन कमांड को देखना चाहिए।

+2

आप आप इसे बनाया है एक ही पल (जून 19 '14 2:48 पर) पर अपने ही सवाल का जवाब था? – robert

+0

मैं इसे भूल गया हूं, लेकिन मुझे लगता है कि यह हो सकता है। –

+3

अपने स्वयं के प्रश्न का उत्तर देना @robert की अनुमति दी है (एक के लिए प्रोत्साहित किया) इतने पर: http://stackoverflow.com/help/self-answer –

25

दूसरे शब्दों में, फ़ंक्शन नए वैरिएबल स्कोप को धक्का देता है और पॉप करता है (बनाये गये चर और फ़ंक्शन में केवल परिवर्तित होते हैं), मैक्रो नहीं करता है। हालांकि, आप कमांड के PARENT_SCOPE पैरामीटर के साथ फ़ंक्शन डिफ़ॉल्ट व्यवहार को ओवरराइड कर सकते हैं।