CMake的if (condition)
...
else if (...)
...
else (...)
...
endif (...)
是这样的:
else if (...)
(...)
else (...)
测试单独条件
为什么else
而不只是endif (...)
?为什么endif
而不是function(funcname ...)
...
endfunction(funcname ...)
?
Cmake的功能是这样的:
endfunction(funcname ...)
为什么endfunction
而不仅仅是endif ()
?
我可以省略它们出现的冗余括号内容,如下所示:{{1}}。这个结构的目的是什么?
答案 0 :(得分:8)
我认为最初的意图是,通过重复每个子句(例如,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 ()
可以认为更清楚。上面的语法仍然可以使用。
为了完全回答你的问题,括号也保持空参数,因为CMake中的概念else
和endif
是像if
这样的宏,因此用这个语法调用它们,一个一点点(但根本不是)与函数一样。
要添加一点历史记录,在CMake 2.4中重复表达是必须的,至少仍然在CMake 2.6,至少根据文档。文档在else
上含糊不清,但坚持endif
:
请注意,必须为if和endif。
指定相同的表达式
第一次尝试删除此约束已经在CMake 2.4.3(2006年)中引入,可以通过写入来禁用它:
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
此约束在CMake 2.8
时完全可选请注意,else和endif子句中的表达式是可选的。