การขยายมาโครตอบโดย Yantao Xieเปิดตาของฉันจริงๆ!
ฉันยังพบว่าบทช่วยสอนด้านล่างมาพร้อมกับตัวอย่างที่เป็นรูปธรรมซึ่งเป็นประโยชน์ในการทำความเข้าใจแนวคิดขอบเขตตัวแปร
อ้างจากLearn cmake ใน 15 นาที :
ใน CMake คุณสามารถใช้คู่ของfunction
/ endfunction
คำสั่งเพื่อกำหนดฟังก์ชัน นี่คือค่าที่เป็นตัวเลขสองเท่าของอาร์กิวเมนต์จากนั้นพิมพ์ผลลัพธ์:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
ฟังก์ชันทำงานในขอบเขตของตัวเอง ไม่มีตัวแปรใดที่กำหนดไว้ในฟังก์ชันก่อให้เกิดมลพิษต่อขอบเขตของผู้โทร หากคุณต้องการส่งคืนค่าคุณสามารถส่งชื่อตัวแปรไปยังฟังก์ชันของคุณจากนั้นเรียกset
คำสั่งด้วยอาร์กิวเมนต์พิเศษ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
ในทำนองเดียวกันคู่ของmacro
/ endmacro
คำสั่งกำหนดมาโคร มาโครต่างจากฟังก์ชันตรงที่ทำงานในขอบเขตเดียวกับผู้โทร ดังนั้นตัวแปรทั้งหมดที่กำหนดภายในมาโครจึงถูกตั้งค่าในขอบเขตของผู้โทร เราสามารถแทนที่ฟังก์ชันก่อนหน้าด้วยสิ่งต่อไปนี้:
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
ทั้งฟังก์ชันและมาโครยอมรับอาร์กิวเมนต์ตามจำนวนที่กำหนด ARGN
ข้อโต้แย้งที่ไม่มีชื่อมีการสัมผัสกับฟังก์ชั่นเป็นรายการผ่านตัวแปรพิเศษชื่อ
นี่คือฟังก์ชันที่เพิ่มเป็นสองเท่าของทุกอาร์กิวเมนต์ที่ได้รับโดยพิมพ์แต่ละรายการในบรรทัดแยกกัน:
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
และmacro
: ความหมายของreturn()
: เมื่อใช้ใน amacro
คุณจะไม่กลับมาจากมาโคร แต่มาจากฟังก์ชันการโทร