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
函数x
和y
变量0
对应于空字符串,在Make -
是可交换的,所以x - y = y - x
。
那么,是否有理由在评估(x - y) + (y - x) = 0
时实现此功能?
答案 0 :(得分:2)
为什么它使用两个替换来确定两个字符串是否相等?
处理一个字符串只是重复的另一个字符串的情况。因为$(subst)
将删除所有出现的字符串seq
,如果它是这样编写的话会失败:
seq = $(if $(subst $1,,$2),$(false),$(true))
在测试字符串aa
和aaaa
时,$(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:***是的。停止。
糟糕。