CMake의 함수 대 매크로
CMake 2.8.12의 공식 문서 에 대해 말한다macro
호출 될 때 매크로에 기록 된 명령은 먼저 형식 매개 변수 ($ {arg1})를 전달 된 인수로 대체하여 수정 한 다음 일반 명령으로 호출됩니다.
그리고 약 function
호출 될 때 함수에 기록 된 명령은 먼저 형식 매개 변수 ($ {arg1})를 전달 된 인수로 대체하여 수정 된 다음 일반 명령으로 호출됩니다.
분명히 두 개의 따옴표가 거의 동일하지만 혼란 스럽습니다. 매크로처럼 함수를 호출 할 때 처음에 매개 변수를 대체합니까?
아래에 샘플 코드를 작성했습니다.
set(var "ABC")
macro(Moo arg)
message("arg = ${arg}")
set(arg "abc")
message("# After change the value of arg.")
message("arg = ${arg}")
endmacro()
message("=== Call macro ===")
Moo(${var})
function(Foo arg)
message("arg = ${arg}")
set(arg "abc")
message("# After change the value of arg.")
message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(${var})
출력은 다음과 같습니다.
=== Call macro ===
arg = ABC
# After change the value of arg.
arg = ABC
=== Call function ===
arg = ABC
# After change the value of arg.
arg = abc
보인다 그래서 arg
값 할당 var
호출 할 때를 Foo
와 ${arg}
로 대체 단지 문자열 ${var}
호출 할 때가 Moo
.
따라서 공식 문서에서도 다음과 같이 언급했지만 위의 두 인용문이 하나를 혼동하기가 매우 쉽다고 생각합니다.
그것들은 C 전처리 기가 매크로로하는 것처럼 문자열 대체입니다. 진정한 CMake 변수 및 / 또는 더 나은 CMake 범위 제어를 원하면 함수 명령을 확인해야합니다.
즉, 함수는 새 변수 범위를 푸시하고 팝하지만 (생성 및 변경된 변수는 함수에만 존재 함) 매크로는 그렇지 않습니다. 그러나 명령 의 PARENT_SCOPE
매개 변수를 사용하여 함수 기본 동작을 재정의 할 수 있습니다 set
.
인용 한 cmake 문서는 너무 오해의 소지가있어서 기본적으로 잘못되었습니다. 다음과 같이 명확히 / 수정되어야합니다.
- 매크로 : 호출 될 때, 매크로에 기록 된 명령은 먼저 형식 매개 변수 ($ {arg1})를 전달 된 인수로 대체하여 실행되기 전에 모두 수정 됩니다.
cmake --trace-expand
정확히 무슨 일이 일어나는지 보여줍니다.
cmake 3.13.3 문서는 이와 관련하여 2.8.12와 비교하여 변경되지 않았습니다.
참고 URL : https://stackoverflow.com/questions/24297999/function-vs-macro-in-cmake
'Program Tip' 카테고리의 다른 글
C #에서 Pop3를 사용하여 이메일 읽기 (0) | 2020.10.19 |
---|---|
web.config를 편집하면 어떻게됩니까? (0) | 2020.10.19 |
Windows 10의 Virtualbox에서 작동하지 않는 브리지 네트워킹 (0) | 2020.10.19 |
자바 구성 프레임 워크 (0) | 2020.10.19 |
Subversion의 특정 코드 줄에 대한 변경 내역 (0) | 2020.10.19 |