从以下方面获取灵感: https://cmake.org/cmake/help/v3.0/command/macro.html
我做:
macro(ARGS_TEST)
message(WARNING "\nARGN: ${ARGN}\n")
foreach(arg IN LISTS ARGN)
message(WARNING "\n ARG : ${arg} \n")
endforeach()
endmacro()
ARGS_TEST(test 1 2 3)
打印:
ARGN: test;1;2;3
但此后没有任何内容,这意味着对ARGN的迭代似乎没有发生。
我缺少什么?
回答以下问题: Passing a list to a cmake macro
显示了如何将参数作为列表打印,而不是如何迭代它们
答案 0 :(得分:2)
Macro argument aren't variables。因此,在这种情况下,ARGN不会像其他列表一样对待。我认为有两种方法可以解决这个问题:
在我对您的样本进行的返工中,我发送了消息STATUS消息以简化测试。这也应该与WARNING一起使用。
第一种方法是使其成为一种功能:
function(ARGS_TEST_FUNCTION)
message(STATUS "\nARGN: ${ARGN}\n")
foreach(arg IN LISTS ARGN)
message(STATUS "\n ARG : ${arg} \n")
endforeach()
endfunction()
ARGS_TEST_FUNCTION(test 1 2 3)
像这样ARGN是一个变量,并按预期扩展。如果您想在此循环中设置值,则需要使用set和PARENT_SCOPE。如果您正在调用其他宏并且不知道他们想要设置的每个变量,则可能无法使用父作用域。
或者我们可以自己进行扩展并告诉foreach我们正在通过一个列表:
macro(ARGS_TEST)
message(STATUS "\nARGN: ${ARGN}\n")
foreach(arg IN ITEMS ${ARGN})
message(STATUS "\n ARG : ${arg} \n")
endforeach()
endmacro()
ARGS_TEST(test 1 2 3)
这来自CMake文档中的foreach page