gpt4 book ai didi

list - 遍历字符串列表

转载 作者:行者123 更新时间:2023-12-03 11:15:21 24 4
gpt4 key购买 nike

我想遍历以字符串形式给出的项目列表。根据CMake的要求,项目之间用分号分隔。以下

cmake_minimum_required(VERSION 2.8)

FOREACH(LETTER "a;b;c")
MESSAGE("<<${LETTER}>>")
ENDFOREACH()

将字符串 "a;b;c"解释为字符串文字。相反,当首先将 "a;b;c"分配给变量时,所有结果都是按预期进行的。
cmake_minimum_required(VERSION 2.8)

SET(MYLIST "a;b;c")
FOREACH(LETTER ${MYLIST})
MESSAGE("<<${LETTER}>>")
ENDFOREACH()

这是推荐的列表循环方法,还是有一个更优雅的解决方案?

最佳答案

造成混淆的原因可能是CMake对带引号的字符串的特殊解释。

例如,以下所有内容均正确迭代了字符串列表:

(1) foreach(LETTER a b c) [...]
(2) foreach(LETTER a;b;c) [...]
(3) set(MYLIST "a;b;c")
foreach(LETTER ${MYLIST}) [...]

唯一不起作用的情况是
(4) foreach(LETTER "a;b;c") [...]

CMake's language manual for unquoted arguments中找到 (1)(2)起作用的原因:

Unquoted argument content consists of all text in a contiguous block of allowed or escaped characters. Both Escape Sequences and Variable References are evaluated. The resulting value is divided in the same way Lists divide into elements. Each non-empty element is given to the command invocation as an argument. Therefore an unquoted argument may be given to a command invocation as zero or more arguments.



请注意,这与 quoted arguments不同,后者也评估转义序列和变量引用,但不进行列表扩展。这说明了 (4)失败的原因。

现在有趣的问题是,为什么 (3)仍然成功。 set 将接受单个值和列表值参数。实际上,结束 )或关键字 CACHEPARENT_SCOPE之一之前的所有内容都被视为该值的一部分。因此,以下两个命令是等效的:
set(MYLIST "a;b;c")
set(MYLIST a;b;c)

在这两种情况下, MYLIST的值均为 a;b;c(不带引号)。

现在,当我们将 ${MYLIST}扩展为另一个命令时,您可以想到它用 MYLIST的值 a;b;c进行了简单的字符串替换。然后,将通过带引号或不带引号的参数规则扩展结果命令。也就是说,以下将起作用:
foreach(LETTER ${MYLIST}) [...]

虽然这不会:
foreach(LETTER "${MYLIST}") [...]

关于list - 遍历字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com