如何解决在 CMake 中,如何检查字符串是否包含整数?
我在 CMake 中有一个字符串,它以某种方式在变量 MYVAR
中得到。我想检查该字符串是否是整数 - 可能带有空格。我有一个丑陋的方法:
string(REGEX MATCH "^[ \t\r\n]*[0-9]+[ \t\r\n]*$" MYVAR_PARSED "${MYVAR}")
if ("${MYVAR_PARSED}" STREQUAL "")
message(FATAL_ERROR "Oh no!" )
endif()
# Now I can work with MYVAR as a number
注意:我使用的是 here 中记录的 CMake 正则表达式语法。
解决方法
选项 1:完全匹配
我想检查该字符串是否是整数 - 可能带有空格。
如果这是我需要的确切规格,那么我会像这样检查:
string(STRIP "${MYVAR}" MYVAR_PARSED)
if (NOT MYVAR_PARSED MATCHES "^[0-9]+$")
message(FATAL_ERROR "Expected number,got '${MYVAR}'")
endif ()
这首先从 MYVAR
中删除空格,将结果存储在 MYVAR_PARSED
中。然后,它会检查 MYVAR_PARSED
是否为非空数字序列,如果不是,则会出错。
我认为做这个临时的很好,但如果你想要一个函数:
function(ensure_int VAR VALUE)
string(STRIP "${VALUE}" parsed)
if (NOT parsed MATCHED "^[0-9]+$")
message(FATAL_ERROR "Expected number,got '${VALUE}'")
endif()
set(${VAR} "${parsed}" PARENT_SCOPE)
endfunction()
ensure_int(MYVAR_PARSED "${MYVAR}")
选项 2:更宽松的匹配
但是,在某些情况下,以下解决方案可能更可靠,具体取决于您的要求:
math(EXPR MYVAR_PARSED "${MYVAR}")
这会将 MYVAR
的值解释为 64 位有符号 C 整数上的简单数学表达式。它将以十六进制解释 0x
前缀的数字。它可以识别大多数 C 算术运算符。
另一方面,它可能过于宽容:此解决方案将接受诸如 0 + 0x3
之类的东西。它还会根据表达式的损坏程度发出不同的警告或错误。但是,如果您随后验证数字的 range 或其他内容,这可能不是问题。例如,您可以检查 if (MYVAR_PARSED LESS_EQUAL 0)
,如果是,则出错。
math
命令的文档:https://cmake.org/cmake/help/latest/command/math.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。