CMake宏:如何迭代处理参数

4

我希望您能够从以下内容中获取灵感: 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 上的迭代似乎没有发生。
我错过了什么吗?
下面是问题的回答: 将列表传递给cmake宏 说明如何将参数打印为列表,但没有说明如何对它们进行迭代。

你忽略了一个事实,即在宏中 ARGN 不是普通变量。关于如何针对列表克服这个问题,请参见此处:https://dev59.com/BW435IYBdhLWcg3wuiqz - Tsyvarev
@Tsyvarev 是的,但我正在遵循文档中的示例--;关于可能的重复问题,它似乎没有回答我的问题,它将列表转换为字符串而不是允许迭代它(或者我没有理解答案?) - Vince
我正在遵循文档中的示例。如果您谈论最后一个示例,则它在函数内使用宏调用。在这种情况下,宏从函数中获取 ARGN 变量。请仔细阅读。但是对于您的情况,重复实际上是错误的,抱歉。 - Tsyvarev
1个回答

4

宏参数不是变量。因此,在这个上下文中,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 页面


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接