Yantao Xie tarafından cevap makro genişleme, gerçekten gözlerimi açar!
Ayrıca, aşağıdaki öğreticinin değişken kapsam kavramını anlamaya yardımcı olacak bazı somut örneklerle birlikte geldiğini gördüm.
Learn cmake'den 15 dakikada alıntı :
CMake'de, bir işlevi tanımlamak için bir çift function
/ endfunction
komut kullanabilirsiniz. İşte argümanının sayısal değerini iki katına çıkaran ve ardından sonucu yazdıran:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Fonksiyonlar kendi kapsamlarında çalışır. Bir işlevde tanımlanan değişkenlerin hiçbiri, arayanın kapsamını kirletmez. Bir değer döndürmek istiyorsanız, bir değişkenin adını işlevinize iletebilir, ardından set
özel bağımsız değişkenle komutu çağırabilirsiniz PARENT_SCOPE
:
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
Benzer şekilde, bir çift macro
/ endmacro
komut bir makroyu tanımlar. Fonksiyonların aksine, makrolar çağıranla aynı kapsamda çalışır. Bu nedenle, bir makro içinde tanımlanan tüm değişkenler, arayanın kapsamında ayarlanır. Önceki işlevi aşağıdakilerle değiştirebiliriz:
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
Hem işlevler hem de makrolar rastgele sayıda bağımsız değişken kabul eder. Adsız argümanlar, adı verilen özel bir değişken aracılığıyla işleve bir liste olarak sunulur.ARGN
.
İşte aldığı her argümanı ikiye katlayan, her birini ayrı bir satıra yazdıran bir işlev:
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
function
vemacro
semantik:return()
Bir kullanıldığında:macro
, makro gelen ancak arama işlevinden döndürmez.