为什么 CMake 语法到处都有多余的括号?

2023-12-25

CMake's if像这样:

if (condition)
    ...
else if (...)
    ...
else (...)
    ...
endif (...)

With else if (...) the (...)测试单独的条件。
Why else (...)不仅仅是else? Why endif (...)并不是endif?


Cmake的功能如下:

function(funcname ...)
    ...
endfunction(funcname ...)

Why endfunction(funcname ...)而不仅仅是endfunction?


我可以省略出现的多余括号的内容,如下所示:endif ()。这个构造的目的是什么?


我相信最初的意图是,通过在每个子句中重复(例如,else语句)初始表达式(例如,位于if语句)它将更清楚地表明哪个语句实际上已关闭,并且解析器可以验证并警告没有发生任何错误。

然而,事实证明你会有这样的表情:

if (VARIABLE matches "something")
[...] #This is executed when above condition is true
else (VARIABLE matches "something") #Looks very much like an elseif...
[...] #This is executed when above condition is false!
endif (VARIABLE matches "something")

结果令人困惑。我正在谈论我的日常经历,例如我写了一些东西,然后有人来问我“这是做什么的?”

所以,现在 CMake 也允许放置空括号,上面的内容可以重写为:

if (VARIABLE matches "something")
[...] #This is executed when above condition is true
else ()
[...] #This is executed when above condition is false
endif ()

这也算比较清楚了。上面的语法仍然可以使用。

为了完全回答你的问题,括号也保留空参数,因为从概念上讲else and endif在 CMake 中有类似的宏if,因此它们是用这个语法调用的,a一点(但不完全是)作为函数。


Basically the same explanation is available in CMake FAQs: Isn't the "Expression" in the "ELSE (Expression)" confusing? https://gitlab.kitware.com/cmake/community/wikis/FAQ#isnt-the-expression-in-the-else-expression-confusing.

为了添加一点历史,在 CMake 2.4 中重复表达式是必须的,并且仍然在CMake 2.6 http://www.cmake.org/cmake/help/cmake2.6docs.html#command:if,至少根据文档。该文档含糊不清else,但坚定不移endif:

请注意,if 和 endif 必须使用相同的表达式。

CMake 2.4.3(2006 年)已经引入了消除此约束的第一次尝试,可以通过编写以下内容来停用它:

set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)

这个约束变得完全可选CMake 2.8 http://www.cmake.org/cmake/help/v2.8.0/cmake.html#command:if

请注意,else 和 endif 子句中的表达式是可选的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 CMake 语法到处都有多余的括号? 的相关文章

  • 使用星号更改多个源文件的 CMake 编译器标志

    我正在尝试调试与编译器优化相关的问题 O2 或以下版本没有问题 O3 出现段错误 并且我希望能够切换我的源代码块的编译器标志 以便我可以尝试缩小段错误的来源范围 我可以将全局优化级别设置为 O2 并更改单个文件的属性 如下所示 SET SO
  • JavaScript 中的小数点分隔符是什么?

    当我正在编写一段处理一些浮点值的 JavaScript 代码时 我突然想到了一个想法 JavaScript 中的小数点符号是什么 是不是总是 或者它是特定于文化的 那么呢 toFixed and parseFloat 如果我正在处理用户输入
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • Objective C“#if”语法

    我对 如果 或 如果 有点困惑 if当我查看一些类时我看到的语法 例如 if someConstant someNumber do something elif etc versus if someConstant someNumber d
  • 当前上下文中不存在名称“str”

    我在这里声明了一个类变量 void downloader OpenReadCompleted object sender OpenReadCompletedEventArgs e if e Error null Stream respons
  • 使用 CMake 和 clang 在 Windows 上构建简单的 C++ 项目

    我正在尝试在 Windows 10 上构建一个简单的 Hello World 程序 最好使用 CMake 和 clang 如果我使用 MinGW 的 g 编译器 我可以成功编译 链接和运行同一个项目 但当我尝试使用 clang 时会遇到问题
  • Cmake选项默认值

    如果我有一个 CMakeLists txt 文件 cmake minimum required VERSION 2 8 OPTION FOO Foo Option OFF MESSAGE FOO FOO 然后我调用 cmake 得到以下输出
  • 快速向量初始化 C++ [重复]

    这个问题在这里已经有答案了 可能的重复 C 使用硬编码元素初始化 STL 向量的最简单方法 https stackoverflow com questions 2236197 c easiest way to initialize an s
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • 路径中的波形符不会扩展到主目录

    假设我有一个名为Foo位于 home user my home user也代表为 我想要一个变量 a Foo 然后做 cd a I get bash cd Foo No such file or directory 但是如果我这样做cd F
  • CMAKE - 运行时库隐藏文件

    我正在运行 Linux Redhat 我安装了 Anaconda 并且我正在尝试使用安装程序 libspimage CMAKEamd 我收到以下警告 错误 src CMakeLists txt 74 ADD LIBRARY 处的 CMake
  • 将 cmake 与 nmake x64 一起使用

    我使用 cmake 生成 NMake 文件 一切正常 我使用 x64 工具集 没有 Visual Studio 只有 SDK 因此我输入 nmake 但它生成 x86 构建而不是 x64 构建 你知道为什么吗 以及如何强制 nmake 以
  • CMake、Exe找不到DLL

    所以我尝试在 Windows 上使用 cmake 设置一个项目 这就是我的项目结构 游戏引擎 git build include source testing CMakeLists txt 这个想法是 source 目录包含 GameEng
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 我可以安装共享导入库吗?

    我有一个外部项目和一个导入的共享库 include 目录和 implib 都可以正常工作 但尝试安装共享库 dll 失败并出现以下错误 install TARGETS given target my shared lib which doe
  • 如何使用cmake自动构建第三方库

    我在寻找什么 下载库 提取它 应用自定义补丁 运行配置 运行构建命令 我正在尝试构建的库是 Openssl Boost Thrift C ares Curl Pcre Nginx ICU JsonCPP 我想我可以使用外部模块做这些事情 h
  • CMake:Fortran 模块和编译顺序

    我有一个大型 Fortran 程序 其中包含许多目录 每个目录都在伪库中单独编译 但仍然存在相互依赖的混乱 因此最终所有伪库都组合在一个可用的库中 我想使用 Fortran 模块 但它非常脆弱 因为我不能依赖自动依赖项检查 并且根据顺序编译
  • CMakeLists.txt:30(项目)处的 CMake 错误:找不到 CMAKE_C_COMPILER

    我正在尝试使用 CMake 制作 Visual Studio 解决方案来编译最新版本的 aseprite 并且 CMake 不断向我提供 No CMAKE C COMPILER could be found No CMAKE CXX COM
  • 在 CMake 中使用 -isystem 而不是 -I

    在使用 gcc 构建时 CMake 是否有任何方法可以强制通过 include directories 或者可能通过不同的函数 指定的路径使用 isystem 标志而不是 I 标志 See http gcc gnu org onlinedo
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的

随机推荐