Macros CMake宏:如何迭代参数
灵感来自: 我有: 其中打印:Macros CMake宏:如何迭代参数,macros,cmake,arguments,iteration,Macros,Cmake,Arguments,Iteration,灵感来自: 我有: 其中打印: ARGN: test;1;2;3 但这之后什么都没有,这意味着ARGN上的迭代似乎没有发生 我遗漏了什么 对下列问题的答复: 显示如何将参数打印为列表,但不显示如何迭代参数。因此,在此上下文中,ARGN与其他列表不同。我认为有两种方法可以解决这个问题: 在我对你的样本进行的修改中,我制作了你的状态信息,以便于我的测试。这应该与警告一起工作 第一种方法是使其成为一个函数: function(ARGS_TEST_FUNCTION) message(STATU
ARGN: test;1;2;3
但这之后什么都没有,这意味着ARGN上的迭代似乎没有发生
我遗漏了什么
对下列问题的答复:
显示如何将参数打印为列表,但不显示如何迭代参数。因此,在此上下文中,ARGN与其他列表不同。我认为有两种方法可以解决这个问题:
在我对你的样本进行的修改中,我制作了你的状态信息,以便于我的测试。这应该与警告一起工作
第一种方法是使其成为一个函数:
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文档中的您错过了一件事,那就是在宏
ARGN
中。关于克服这个问题,请看这里:@Tsyvarev是的,但我遵循文档中的示例--;关于可能的重复,它似乎没有回答我的问题,它将列表强制转换为字符串,而不允许对其进行迭代(或者我无法理解答案?我正在按照文档中的示例进行操作
——如果您谈到上一个示例,它在函数中使用宏调用。在这种情况下,宏从函数中获取ARGN变量。仔细阅读。但是你的案子的副本是错的,对不起。
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)