2013-01-17 14 views
18

jak we wspomnianym w tytule, chciałbym napisać "miłą" funkcję w cmake, która jest w stanie zmodyfikować zmienną, która jest przekazywana jako parametr do tej funkcji.Jak napisać ładną funkcję, która przekazuje zmienne przez odwołanie?

Jedynym sposobem mogę myśleć robi to jest brzydki:

Definicja funkcji

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

Wykorzystanie

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

Wynik

arg = foofoo 

Wydaje mi się, że nie ma prawdziwej koncepcji zmiennych, które można w ogóle pominąć ?! Mam wrażenie, że istnieje coś fundamentalnego w cmake, którego jeszcze nie brałem.

Czy istnieje lepszy sposób na zrobienie tego?

Wielkie dzięki!

+0

https://github.com/boostcon/cppnow_presentations_2017/blob/master/05-19-2017_friday/effective_cmake__daniel_pfeifer__cppnow_05-19-2017.pdf sugeruje, że używasz makr, gdy chcesz zmodyfikować parametr. –

Odpowiedz

33

Nie trzeba przekazywać wartości i nazwy zmiennej. Nazwa jest mało, ponieważ można uzyskać dostęp do wartości nazwą:

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

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

wyjścia "foofoo"

+1

wielkie dzięki, działa. Jednak zauważyłem dziwne zachowanie, zobacz [tutaj] (http://stackoverflow.com/questions/14397298/cmake-strange-function-argument-name-behavour) – nandaloo

6

używam tych dwóch makr do debugowania:

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

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

Zastosowanie:

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

Wyjście:

MyFoo=MyFoo's value 
Powiązane problemy