GMSL seq函数的实现

时间:2016-05-26 19:33:37

标签: string makefile gnu-make equality gmsl

GNU Make Standard Library包含seq功能。它比较两个字符串并以$(true)$(false)的形式返回一个布尔值,表明它们是否相等。

使用subst函数实现:

seq = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true))

我想了解的是:

  • 为什么使用两个替换来确定两个字符串是否相等?

  • 为什么它会在两个字符串前加x

显然,通过评估x - y = 0测试平等,其中:

  • 二进制-运算符对应subst函数
  • 这两个字符串对应xy变量
  • 0对应于空字符串,在Make
  • 中逻辑上为false

-是可交换的,所以x - y = y - x

那么,是否有理由在评估(x - y) + (y - x) = 0时实现此功能?

2 个答案:

答案 0 :(得分:2)

为什么它使用两个替换来确定两个字符串是否相等?

处理一个字符串只是重复的另一个字符串的情况。因为$(subst)将删除所有出现的字符串seq,如果它是这样编写的话会失败:

seq = $(if $(subst $1,,$2),$(false),$(true))

在测试字符串aaaaaa时,$(subst aa,,aaaa)将是一个空字符串,可以给出答案$(false),但会反转字符串$(subst aaaa,,aa)将是aa,这将给出答案。

因此,替换是通过两种方式完成的,以确保从$1移除$2时结果为空字符串,反之亦然(我使用$(subst)作为$(if)这里的减法运算符)。由于$(subst)的工作方式,两个x基本上都是AND(空字符串== true,因此字符串的连接变为AND)。

为什么它会为这两个字符串添加seq

seq = $(__gmsl_tr2)$(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true)) 的实施方式如下:

x

不幸的是,我在前面的$(subst)&#39}的推理似乎已经迷失在时间的迷雾中。我怀疑它与GNU make经常会删除空格的事实有关,并且在$(subst ,,the quick brown) 空格的情况下被删除。参见

的输出
$(subst e, ,the quick brown)

注意那里的双重空间。现在看看

的输出
$(subst)

在第一种情况下,空间被GNU make消耗,$(subst)没有做任何事情。在第二种情况下,空间消耗。

然而,在我使用$1的上下文中,这并不重要,因为来自像space := space += $(subst $(space),,the quick brown) 这样的变量的空格被保留(即空间剥离在扩展之前发生)。你可以看到以下内容:

space

the quick brown中放置一个空格字符,然后使用它来移除x中的空格。

所以,我认为{{1}}是不必要的。

答案 1 :(得分:0)

观察如果只进行一次比较会发生什么

seq = $(if $(subst x$1,,x$2),false,true)
$(error $(call seq,,xxxxxx))

Makefile:2:***是的。停止。

糟糕。