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

时间:2015-04-30 04:37:57

标签: syntax cmake language-design

CMake的if (condition) ... else if (...) ... else (...) ... endif (...) 是这样的:

else if (...)

(...) else (...)测试单独条件 为什么else而不只是endif (...)?为什么endif而不是function(funcname ...) ... endfunction(funcname ...)

Cmake的功能是这样的:

endfunction(funcname ...)

为什么endfunction而不仅仅是endif ()

我可以省略它们出现的冗余括号内容,如下所示:{{1}}。这个结构的目的是什么?

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中的概念elseendif是像if这样的宏,因此用这个语法调用它们,一个一点点(但根本不是)与函数一样。

<小时/> 基本上相同的解释可以在CMake常见问题解答中找到:Isn't the "Expression" in the "ELSE (Expression)" confusing?

要添加一点历史记录,在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子句中的表达式是可选的。