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

sor*_*bet 7 syntax language-design cmake

CMake是if这样的:

if (condition)
    ...
else if (...)
    ...
else (...)
    ...
endif (...)
Run Code Online (Sandbox Code Playgroud)

随着else if (...)(...)一个单独的条件测试.
为什么else (...)而不仅仅是else?为什么endif (...)endif呢?


Cmake的功能如下:

function(funcname ...)
    ...
endfunction(funcname ...)
Run Code Online (Sandbox Code Playgroud)

为什么endfunction(funcname ...)而不是简单endfunction


我可以省略它们出现的冗余括号的内容,如下所示:endif ().这个结构的目的是什么?

Ant*_*nio 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")
Run Code Online (Sandbox Code Playgroud)

结果令人困惑.我说的是我每天的经历,例如我写了一些东西,其他人来问我"这是做什么的?"

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

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

这可以被认为更清楚.上面的语法仍然可以使用.

为了完全回答你的问题,括号也保持空参数,因为在概念上elseendif在CMake中都是宏if,因此它们用这个语法调用,与函数一点点(但根本不完全相同).


基本上相同的解释可以在CMake常见问题解答中找到:"ELSE(表达式)"中的"表达式"不是令人困惑吗?.

为了增加一点历史,在CMake 2.4中重复表达是必须的,至少在CMake 2.6中,至少根据文档.文档含糊不清else,但坚持endif:

请注意,必须为if和endif赋予相同的表达式.

第一次尝试删除此约束已经在CMake 2.4.3(2006年)中引入,可以通过以下方式将其停用:

set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
Run Code Online (Sandbox Code Playgroud)

使用CMake 2.8,此约束完全可选

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