Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 为什么CMake语法到处都有多余的括号?_Syntax_Cmake_Language Design - Fatal编程技术网

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

Syntax 为什么CMake语法到处都有多余的括号?,syntax,cmake,language-design,Syntax,Cmake,Language Design,CMake's如果s这样做: if (condition) ... else if (...) ... else (...) ... endif (...) function(funcname ...) ... endfunction(funcname ...) 如果(…)使用else,则(…)测试单独的条件。 为什么else(…)而不仅仅是else?为什么endif(…)而不是endif Cmake的函数如下所示: if (condition) .

CMake's
如果
s这样做:

if (condition)
    ...
else if (...)
    ...
else (...)
    ...
endif (...)
function(funcname ...)
    ...
endfunction(funcname ...)
如果(…)使用
else,则
(…)
测试单独的条件。
为什么
else(…)
而不仅仅是
else
?为什么
endif(…)
而不是
endif


Cmake的函数如下所示:

if (condition)
    ...
else if (...)
    ...
else (...)
    ...
endif (...)
function(funcname ...)
    ...
endfunction(funcname ...)
为什么
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 ()
这可以被认为是更清楚的。上面的语法仍然可以使用

为了完全回答您的问题,括号中还保留了空参数,因为从概念上讲,CMake中的
else
endif
是类似于
if
的宏,因此它们是用这种语法调用的,有一点(但完全不是)作为函数。
CMake常见问题解答中提供了基本相同的解释:

为了增加一点历史,在CMake 2.4中,至少根据文档,重复该表达式是必须的,并且仍然是必须的。文档在
else
上模棱两可,但在
endif
上却很坚定:

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

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

set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
此约束在以下情况下变得完全可选:

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


我相信这是出于历史原因。语言最初不是为了干净而设计的。跟我说话吗?不是我被否决的。:)@whjm我不是指你,但我可以看到历史上有其他人出于某种未知的原因:(最初的作者受shell脚本的启发,在shell脚本中,一切都是一个命令(if、then、else、for、do、end、fi……所有这些以及更多都是命令!)。与shell脚本相比,他们需要括号,似乎他们希望在整个语法中保持一致。现在他们到处都有括号,不知道如何处理它们。因此他们允许使用一些参数,例如
endfunction
。可能是为了“确保事情完全按照程序员的要求进行"…或者类似的。这回答了你的问题吗?你有链接吗?我不完全相信这个解释。肯定有人已经意识到这是一个多么愚蠢的想法,并在它进入语言之前对它进行了更好的思考。也许还有其他原因,或者也许我从来没有看到过这方面的好用例truct?@sorbet我用一些“历史”信息编辑了答案。这是一个选择,可能不是一个好的选择,他们继续前进。我认为你不应该在一家公司的图片中使用“哑”这个词,该公司开发并免费提供了一个交叉编译工具,许多程序员都成功地使用了这个工具。