# MACRO宏和FUNCTION函数命令测试

# 宏实现的仅仅是字符串替换，宏定义的过程中变量是无法进行修改的，
# 而函数却是可以的。
set(var1 "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endmacro(Moo arg)
message("=== Call macro ===")
Moo(${var1})
message("MOO_var1 = ${var1}")

function(Foo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction(Foo arg)
message("=== Call function ===")
Foo(${var1})
message("FOO_var1 = ${var1}")


# 无论是宏还是函数，当调用的时候如果使用的是set出来的变量，
# 都必须通过${}将变量的内容传递进去，而不能只写上变量名。
set(var2 "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(var2)

function(Foo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(var2)

# 宏的参数由于不是传统意义上的变量，而是字符串替换，因此需要通过${}取出内容,
# 而函数却不一定需要这样。
set(var "ABC")

macro(Moo arg)
  if (arg STREQUAL "ABC")
    message("arg1 = ${arg}")
  endif()
  if (${arg} STREQUAL "ABC")
    message("arg2 = ${arg}")
  endif()
endmacro()
message("=== Call macro ===")
Moo(${var})

function(Foo arg)
  if (arg STREQUAL "ABC")
    message("arg1 = ${arg}")
  endif()
  if (${arg} STREQUAL "ABC")
    message("arg2 = ${arg}")
  endif()
endfunction()
message("=== Call function ===")
Foo(${var})