Program Tip

CMake의 함수 대 매크로

programtip 2020. 10. 19. 12:36
반응형

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

반응형