在cmake中,有什么区别:
set(any_new_var ${old_var})
Run Code Online (Sandbox Code Playgroud)
和
set(any_new_var "${old_var}")
Run Code Online (Sandbox Code Playgroud)
有什么重要区别?我何时使用其中一种形式?
例如,我尝试下一个迷你测试
# test.cmake
# Variable 'a' isn't defined.
set(hola "${a}")
# message(${hola})
message("${hola}")
Run Code Online (Sandbox Code Playgroud)
这个迷你测试(cmake -P test.cmake)的输出是一个空行(因为'a'没有定义).如果我取消注释第一条消息,cmake会抛出一条消息错误:
CMake Error at prueba.cmake:6 (message):
message called with incorrect number of arguments
Run Code Online (Sandbox Code Playgroud)
为什么在第二种情况下它不会抛出错误但是空行?
rae*_*aek 13
在CMake中,字符串可以解释为列表.规则很简单:形成列表以分号分隔字符串.例如,字符串值one;two;three可以被认为是作为三个元件的列表:one,two,和three.
要调用命令,请编写命令名称和括号之间的一些单词.但是,这些单词与命令以一对一的方式接收的参数不对应.每个单词变为零个或多个参数,并且所有参数都连接在一起. 除非引用一个单词,否则它将被视为一个列表并扩展为多个参数.引用的词总是成为一个参数.
例如,假设X绑定到one;two;three,Y绑定到空字符串,并Z绑定到foo.以下命令调用有三个单词,但该命令接收四个参数:
some_command(${X} ${Y} ${Z})
# The command receives four arguments:
# 1. one
# 2. two
# 3. three
# 4. foo
Run Code Online (Sandbox Code Playgroud)
如果我们引用这些词,该命令将收到三个参数:
some_command("${X}" "${Y}" "${Z}")
# The command receives three arguments:
# 1. one;two;three
# 2. (the empty list)
# 3. foo
Run Code Online (Sandbox Code Playgroud)
要返回原始问题:该message命令可以接收不同数量的参数.它接受所有参数,将它们连接成一个字符串,然后打印该字符串.但由于某些未知原因,它不接受零参数.
message具有多个参数的行为不是很有用,因此您倾向于使用单个带引号的参数:
set(SOURCES foo.c hoo.h)
message(${SOURCES}) # prints foo.cfoo.h
message("${SOURCES}") # prints foo.c;foo.h
Run Code Online (Sandbox Code Playgroud)
此外,当set接收到多个参数时,它会构建由分号分隔的参数字符串.然后将变量设置为该字符串.
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |