You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中;""的解析规则及相关脚本行为疑问

CMake脚本解析行为疑问解答

先看你给出的CMake代码及对应行为:

message(;"" )          # prints ""
message(@"" )          # prints @""
message("" )           # prints nothing as expected
message("A";"B" )      # emits a warning and prints A"B"
message("A"-"B" )      # emits a warning and prints A-"B"

对应的警告信息:

[...] Argument not separated from preceding token by whitespace. [...]

你的核心疑问是:为何双引号字符串前的标记未用空格分隔时,双引号会成为字符串的一部分?

核心原因:CMake的词法解析规则

CMake的命令参数解析分为两步:标记拆分和字符串/列表处理,核心规则如下:

  1. 标记拆分:以空白字符(空格、制表符、换行)和特殊字符((、)、;)为分隔,把代码拆分成一个个独立标记。
  2. 字符串识别:只有当"作为一个标记的第一个字符时,才会被当作字符串的起始边界,解析到下一个未转义的"为止,内部的空白和特殊字符会被保留。如果"不是标记的第一个字符,它会被当作普通文本字符,不会触发字符串解析逻辑。

逐个例子解析

  • message("" ):""是单独的标记,"作为标记首字符,被解析为空字符串,因此输出空白,符合预期。
  • message(;"" ):;是特殊字符,被拆分为独立标记(作为列表分隔符),""是另一个独立标记(空字符串)。最终参数列表是["", ""],message命令默认直接拼接多个参数,两个空字符串拼接后输出""。
  • message(@"" ):@""是一个完整标记,@后面的"不是标记首字符,被当作普通字符,因此整个标记被当作文本@""输出。
  • message("A";"B" ):
    • "A"是独立标记,"作为首字符,解析为字符串A。
    • ;是特殊标记(列表分隔符),但它和前面的"A"之间没有空格,触发警告。
    • 后面的"B"因为紧跟在;后无空格,CMake解析时将"当作普通字符,因此第二个参数是包含引号的文本"B"。最终message拼接A和"B",输出A"B"。
  • message("A"-"B" ):
    • -不是CMake的列表分隔符,因此"A"-"B"是一个完整标记。
    • 第一个"是标记首字符,解析到A后的"为止,得到字符串A;后续的-和"B"中的"都被当作普通文本字符,因此整个参数是A-"B",同时因为-和前面的字符串无空格,触发警告,最终输出A-"B"。

内容的提问来源于stack exchange,提问作者pasbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:05:06