2014-09-12 2 views
15

मुझे आश्चर्य है कि क्यों सीएमके में अक्सर चर डॉलर के संकेत और घुंघराले ब्रैकेट के साथ लपेटा जाता है। उदाहरण के लिए, मैंने यह कॉल in a CMake tutorial देखा।

include_directories(${PROJECT_BINARY_DIR}) 

लेकिन मैंने जो कोशिश की, वह वही काम करता है।

include_directories(PROJECT_BINARY_DIR) 

जब ${...} साथ रैपिंग की जरूरत है और यह क्या मतलब है? वेरिएबल्स अक्सर इसके साथ क्यों लपेटे जाते हैं भले ही इससे कोई फर्क नहीं पड़ता?

उत्तर

14

the CMake documentation का हवाला देते हुए:

एक चर संदर्भ रूप ${variable_name} है और एक उद्धरित तर्क या एक गैर उद्धृत तर्क अंदर मूल्यांकन किया जाता है। एक परिवर्तनीय संदर्भ को चर के मान से प्रतिस्थापित किया गया है, या खाली स्ट्रिंग द्वारा चर सेट नहीं है।

दूसरे शब्दों में, PROJECT_BINARY_DIR लिखना, सचमुच, "PROJECT_BINARY_DIR" स्ट्रिंग को संदर्भित करता है। ${...} में इसे Encapsulating आपको PRO12EC51BINARY_DIR नाम के साथ चर के सामग्री देता है।

पर विचार करें:

set(FOO "Hello there!") 
message(FOO)  # prints FOO 
message(${FOO}) # prints Hello there! 

आप शायद पहले से ही अनुमान लगाया है के रूप में, include_directories(PROJECT_BINARY_DIR) बस शामिल निर्देशिकाओं के नाम PROJECT_BINARY_DIR की उपनिर्देशिका जोड़ने का प्रयास करता। अधिकांश बिल्ड सिस्टम पर, यदि ऐसी कोई निर्देशिका मौजूद नहीं है, तो यह केवल कमांड को अनदेखा कर देगी, जिसने आपको इंप्रेशन में धोखा दिया होगा कि यह अपेक्षा के अनुसार काम करता है।

भ्रम का एक लोकप्रिय स्रोत तथ्य से आता है कि if() चर का स्पष्ट dereferencing की आवश्यकता नहीं है:

set(FOO TRUE) 
if(FOO) 
    message("Foo was set!") 
endif() 

फिर the documentation explains this behavior:

if(<constant>)

यह सच है, तो लगातार 1 है , चालू, हाँ, सत्य, वाई, या एक गैर-शून्य संख्या। झूठी अगर स्थिर 0 है, बंद, नहीं, गलत, एन, इग्नोर, नोटफॉन्ड, खाली स्ट्रिंग, या प्रत्यय -NOTFOUND में समाप्त होता है। नामित बूलियन स्थिरांक केस-असंवेदनशील हैं। यदि तर्क इन स्थिरांकों में से एक नहीं है, इसे एक चर के रूप में माना जाता है।

if(<variable>)

यह सच है, तो चर कि एक झूठी स्थिर नहीं है एक मूल्य के लिए परिभाषित किया गया है। अन्यथा झूठा। (नोट मैक्रो तर्क चर नहीं हैं।

unset(BLA) 
set(FOO "BLA") 
if(FOO) 
    message("if(<variable>): True") 
else() 
    message("if(<variable>): False") 
endif() 
if(${FOO}) 
    message("if(<constant>): True") 
else() 
    message("if(<constant>): False") 
endif() 

कौन सा चर मामले में TRUE शाखा, और निरंतर मामले में FALSE शाखा ले जाएगा:)

विशेष रूप से, एक की तरह अजीब उदाहरण के साथ आ सकते हैं। यह इस तथ्य के कारण है कि निरंतर मामले में, सीएमके चेक पर प्रदर्शन करने के लिए एक चर BLA की तलाश करेगा (जिसे परिभाषित नहीं किया गया है, इसलिए हम गलत शाखा में समाप्त होते हैं)।

+0

'if (SFML_FOUND)' जैसे कुछ कैसे काम करते हैं? – danijar

+2

'if()' एक विशेष मामला है, क्योंकि यह दोनों चर और मूल्यों पर काम करता है। जबकि 'if (SFML_FOUND)' और 'if ($ {SFML_FOUND}) 'दोनों काम कर सकते हैं, वे वास्तव में अलग-अलग चीजें करते हैं: जांचें [' if' के लिए प्रलेखन] (http://www.cmake.org/cmake/help /v3.0/command/if.html) और 'if () 'और' if ()' के बीच के अंतर पर विशेष ध्यान दें। मैं तदनुसार जवाब अपडेट करूंगा। – ComicSansMS

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