2013-01-17 14 views
18

, मैं cmake में एक "अच्छा" फ़ंक्शन लिखना चाहता हूं जो उस चर में पैरामीटर के रूप में पारित एक चर को संशोधित करने में सक्षम है।एक अच्छा फ़ंक्शन कैसे लिखना है जो संदर्भ द्वारा चर को पास करता है? शीर्षक में कहा गया है कि

एक ही तरीका है इसे करने में मुझे के बारे में सोच सकते हैं बदसूरत है:

समारोह परिभाषा

function(twice varValue varName) 
set(${varName} ${varValue}${varValue} PARENT_SCOPE) 
endfunction(twice) 

प्रयोग

set(arg foo) 
twice(${arg} arg) 
message("arg = "${arg}) 

परिणाम

arg = foofoo 

ऐसा लगता है कि, वैरिएबल की कोई वास्तविक अवधारणा नहीं है जिसे कोई भी पास कर सकता है ?! मुझे लगता है कि cmake के बारे में कुछ मौलिक है जो मैंने अभी तक नहीं लिया है।

तो, क्या ऐसा करने का एक अच्छा तरीका है?

बहुत बहुत धन्यवाद!

+0

https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf सुझाव देता है कि जब आप पैरामीटर को संशोधित करना चाहते हैं तो आप मैक्रोज़ का उपयोग करते हैं। –

उत्तर

33

आपको वैरिएबल का मान और नाम पास करने की आवश्यकता नहीं है। नाम, पर्याप्त है, क्योंकि आप नाम से मूल्य का उपयोग कर सकते हैं:

function(twice varName) 
    SET(${varName} ${${varName}}${${varName}} PARENT_SCOPE) 
endfunction() 

SET(arg "foo") 
twice(arg) 
MESSAGE(STATUS ${arg}) 

आउटपुट "foofoo"

+1

बहुत बहुत धन्यवाद, यह काम कर रहा है। हालांकि, मैंने कुछ अजीब व्यवहार देखा, [यहां] देखें (http://stackoverflow.com/questions/14397298/cmake-strange-function-argument-name-behaviour) – nandaloo

6

मैं डिबगिंग के लिए इन दो मैक्रो का उपयोग:

macro(debug msg) 
    message(STATUS "DEBUG ${msg}") 
endmacro() 

macro(debugValue variableName) 
    debug("${variableName}=\${${variableName}}") 
endmacro() 

उपयोग:

set(MyFoo "MyFoo's value") 
debugValue(MyFoo) 

आउटपुट:

MyFoo=MyFoo's value 
संबंधित मुद्दे

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