Yantao시에 응답 매크로 확장은 정말 내 눈을 열어!
또한 아래 자습서에는 변수 범위 개념을 이해하는 데 도움이되는 몇 가지 구체적인 예제가 포함되어 있습니다.
15 분 내에 Learn cmake에서 인용 :
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()
A의 사용했을 때macro
, 매크로에서하지만, 호출 함수에서 반환하지 않습니다는.