gpt4 book ai didi

CMake - if() 命令如何处理符号?作为字符串还是变量?

转载 作者:行者123 更新时间:2023-12-03 16:50:56 24 4
gpt4 key购买 nike

我不确定 CMake if()命令会将条件子句中的符号视为 变量 字符串 文字。所以我做了一些实验。

Script1.cmake

cmake_minimum_required(VERSION 3.15)

set(XXX "YYY") #<========== HERE!!

if(XXX STREQUAL "XXX")
message("condition 1 is true") # If reach here, XXX is treated as string
elseif(XXX STREQUAL "YYY")
message("condition 2 is true") # If reach here, XXX is treated as variable
endif()

输出是:
condition 2 is true

所以我来到下面 结论 1 .

对于条件子句中的符号:
  • 如果符号是 定义 之前作为变量,CMake会将其视为变量并使用其值进行评估。
  • 如果符号是 未定义 之前作为变量,CMake 会将其视为字符串。

  • 然后我又做了一个实验。
    set(ON "OFF")
    if(ON)
    message("condition 3 is true") # If reach here, ON is treated as a constant.
    else()
    message("condition 4 is true") # If reach here. ON is treated as a variable.
    endif()

    输出是:
    condition 3 is true

    所以,尽管 ON被明确定义为变量, if命令仍然将其视为 TRUE 值的常量。这与我之前的 直接矛盾。结论 1 .

    那么我如何确定 CMake if() 命令会将符号视为字符串还是变量?

    2019 年 7 月 11 日上午 11:04 添加

    似乎 if(constant)形式在 if() 的其他形式之前陈述。 ( src)

    if(<constant>)

    True if the constant is 1, ON, YES, TRUE, Y, or a non-zero number. False if the constant is 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, the empty string, or ends in the suffix -NOTFOUND. Named boolean constants are case-insensitive. If the argument is not one of these specific constants, it is treated as a variable or string and the following signature is used.



    所以现在,在应用我的 之前,我必须先引用上述规则。结论 1 .
    (这可能是一个答案,但我还不确定。)

    最佳答案

    欢迎来到 CMake 符号解释的荒野。

    如果符号作为变量存在,则使用变量的值计算表达式。否则,将评估变量的名称(或如您所说的文字)。

    如果添加 ${,行为会变得更加一致。和 }序列。然后每次在评估中使用变量的值。如果变量不存在或没有被赋值,那么 CMake 会使用几个占位符值,这些值评估为“false”。这些是您在帖子后半部分提到的值(value)观。

    我相信这样做是为了向后兼容,这是 CMake 非常擅长的。对于 CMake 所做的大多数古怪的事情,它通常以向后兼容的名义。

    至于您在“ON”变量中提到的不一致行为,这可能是由于 CMake 处理命令参数的优先级所致。我必须确定在符号查找发生之前解析常量。

    因此,在了解/预测 if声明会评估,我最好的答案是经验。 CMake 源代码树和逻辑是一头宏伟的、令人讨厌的野兽。

    已经讨论过添加一种替代语言(一种可能具有功能范式的语言),但这是一项相当大的工作。

    关于CMake - if() 命令如何处理符号?作为字符串还是变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56980872/

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