gpt4 book ai didi

cmake - 如何将 CMake 分号分隔列表转换为换行分隔?

转载 作者:行者123 更新时间:2023-12-02 06:40:12 30 4
gpt4 key购买 nike

例如:

set (txt "Hello" "There" "World")
# TODO
message (txt) # Prints "Hello\nThere\nWorld" (i.e. each list item on a new line

我用什么来代替 TODO?

最佳答案

CMake 的列表以分号分隔。所以"Hello" "There" "World"在内部表示为 Hello;There;World .所以一个简单的解决方案是用换行符替换分号:

string (REPLACE ";" "\n" txt "${txt}")

这在本示例中有效,但是让我们尝试一个更复杂的示例:
set (txt "" [[\;One]] "Two" [[Thre\;eee]] [[Four\\;rrr]])
[[ ]]是一个原始字符串,所以 \ 's 被传递到 CMake 的列表的内部表示中,保持不变。内部表示为: ;\;One;Two;Thre\;eee;Four\\;rrr .我们希望它打印:
<blank line>
;One
Two
Thre;eee
Four\\;rrr

我实际上并不是 100% 确定 Four\\;rrr一但我认为是对的。无论如何,通过我们天真的实现,我们实际上得到了这个:
<blank line>
\
One
Two
Thre\
eee
Four\\
rrr

这是因为它不知道不转换转义的实际分号。解决方案是使用正则表达式:
string (REGEX REPLACE "[^\\\\];" "\\1\n" txt "${txt}")

IE。仅替换 ;如果前面是非 \字符(并将该字符放入替换中)。几乎可以工作,但它不处理第一个空元素,因为分号前面没有任何东西。最后的答案是也允许字符串的开头:
string (REGEX REPLACE "(^|[^\\\\]);" "\\1\n" txt "${txt}")

哦,还有 \\\\是因为 CMake 处理字符串文字删除了一个级别的转义,而正则表达式引擎删除了另一个级别。你也可以这样做:
string (REGEX REPLACE [[(^|[^\\]);]] "\\1\n" txt "${txt}")

但我不认为这更清楚。

也许有比这更简单的方法,但我找不到。无论如何,女士们先生们,这就是为什么您永远不应该使用字符串作为您唯一的类型,或者进行带内字符串分隔。尽管如此,可能会更糟 - 至少他们没有像 Bash 那样使用空格作为分隔符!

关于cmake - 如何将 CMake 分号分隔列表转换为换行分隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41633738/

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