The ekspansi makro, dijawab oleh Yantao Xie benar-benar membuka mata saya!
Saya juga menemukan tutorial di bawah ini dilengkapi dengan beberapa contoh konkret, yang membantu untuk memahami konsep ruang lingkup variabel.
Dikutip dari Learn cmake dalam 15 menit :
Di CMake, Anda dapat menggunakan sepasang function
/ endfunction
perintah untuk menentukan fungsi. Ini salah satu yang menggandakan nilai numerik dari argumennya, lalu mencetak hasilnya:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Fungsi berjalan dalam cakupannya sendiri. Tak satu pun dari variabel yang ditentukan dalam suatu fungsi mencemari cakupan pemanggil. Jika Anda ingin mengembalikan nilai, Anda dapat mengirimkan nama variabel ke fungsi Anda, lalu panggil set
perintah dengan argumen khusus 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
Demikian pula, sepasang macro
/ endmacro
perintah mendefinisikan makro. Tidak seperti fungsi, makro berjalan dalam cakupan yang sama dengan pemanggilnya. Oleh karena itu, semua variabel yang ditentukan di dalam makro ditetapkan dalam cakupan pemanggil. Kita dapat mengganti fungsi sebelumnya dengan yang berikut ini:
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
Baik fungsi maupun makro menerima sejumlah argumen yang berubah-ubah. Argumen tanpa nama diekspos ke fungsi sebagai daftar, melalui variabel khusus bernama ARGN
.
Berikut adalah fungsi yang menggandakan setiap argumen yang diterimanya, mencetak masing-masing pada baris terpisah:
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
danmacro
: semantik darireturn()
: Saat digunakan dalam amacro
, Anda tidak akan kembali dari makro tetapi dari fungsi pemanggil.