微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 CMake 中,如何检查字符串是否包含整数?

如何解决在 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 举报,一经查实,本站将立刻删除。