2011-07-13 16 views
8

मैं सेमेक के स्कोपिंग नियमों से पूरी तरह से परिचित नहीं हूं। आईडीएल के लिए आरपीसी कोड-पीढ़ी करते समय मुझे विभिन्न फाइलों की एक सूची बनाने की जरूरत है।सीएमकेई: एक फ़ंक्शन के भीतर एक सूची बनाना और बनाना - निर्देशिका, या वैश्विक दायरे के साथ

function(generate_rpc file_name) 
    set(PROTO_FILES ${PROTO_FILES} ${file_name}) 
endfunction(generate_rpc) 

generate_rpc(BasicProtocol.proto) 
generate_rpc(dummy.proto) 

message(STATUS "PROTO FILES: ${PROTO_FILES}") 

सूची प्रत्येक बार खाली होती है। मुझे संलग्न-सक्षम सूची की आवश्यकता है जिसे किसी फ़ंक्शन के भीतर से बनाया जा सकता है।

उत्तर

8

एक समारोह के बजाय एक मैक्रो का उपयोग करते हुए यह करने के लिए लगता है:

macro(generate_rpc file_name) 
    set(PROTO_FILES ${PROTO_FILES} ${file_name}) 
endmacro(generate_rpc) 

संपादित करें:

CMake कार्यों एक स्थानीय गुंजाइश बनाने के लिए: http://www.cmake.org/cmake/help/syntax.html के अनुसार (आदमी पेज, IMO में होना चाहिए) चर के लिए, और मैक्रोज़ वैश्विक दायरे का उपयोग करें।

+0

हां कि चाल किया, धन्यवाद सेट आदेश में PARENT_SCOPE झंडा जोड़ें। क्या आपके पास दस्तावेज़ीकरण के एक हिस्से के लिए कोई लिंक है जो चर/गुण/कार्यों और मैक्रोज़ के नियमों और अर्थशास्त्र को शामिल करता है? मैं आम तौर पर मैन पेज डॉक्यूमेंटेशन ऑनलाइन का उपयोग करता हूं - लेकिन आम तौर पर इस तरह के विवरण छोड़ देता है। –

11

हालांकि मैक्रोज़ को परिभाषित किया जाता है और कार्यों के समान तरीके से बुलाया जाता है, उदाहरण के लिए उनके बीच कुछ अंतर होते हैं, उदाहरण के लिए स्कोप में और इसके निष्पादन में।

-क्षेत्र:

  • मैक्रो: वैश्विक गुंजाइश है।
  • फ़ंक्शन: एक स्थानीय दायरा है चाहे आप निर्दिष्ट नहीं करते हैं।

निष्पादन: यह सी की तरह सी

  • मैक्रो काम करता है ++ या: चर नाम कॉन्फ़िगर करने से पहले तार को बदल दिया जाता है।

  • फ़ंक्शन: परिवर्तनीय नाम निष्पादन के दौरान प्रतिस्थापित किए जाते हैं।

अंत में,

सेट (PROTO_FILES $ {PROTO_FILES} $ {file_name} PARENT_SCOPE)