GNU Make Standard Library 包含一个 seq
函数。它比较两个字符串并以 $(true)
和 $(false)
的形式返回一个 bool 值,表示它们是否相等。
它是通过 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
? 最佳答案
为什么它使用两次替换来确定两个字符串是否相等?
处理一个字符串只是另一个字符串重复的情况。因为 $(subst)
将删除所有出现的字符串 seq
如果它是这样写的,它会失败得可怕:
seq = $(if $(subst $1,,$2),$(false),$(true))
当测试字符串
aa
和 aaaa
时,因为 $(subst aa,,aaaa)
将是一个空字符串,它将给出答案 $(false)
,但反转字符串和 $(subst aaaa,,aa)
将是 aa
,它将给出答案真。因此,替换是通过两种方式完成的,以确保当从
$1
中删除 $2
时,结果是一个空字符串,反之亦然(我在这里使用 $(subst)
作为减法运算符)。由于 $(if)
的工作方式,两个 $(subst)
本质上是通过 AND 运算在一起的(空字符串 == true,因此字符串的连接变成 AND)。为什么要在两个字符串前加上
x
?seq
实现如下:seq = $(__gmsl_tr2)$(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true))
不幸的是,我对
x
前置的推理似乎已经在时间的迷雾中迷失了。我怀疑这与 GNU make 经常删除空格的事实有关,并且在 $(subst)
的情况下,空格被删除。查看输出$(subst ,,the quick brown)
请注意开始处的双空格。现在看看输出
$(subst e, ,the quick brown)
在第一种情况下,空间被 GNU make 占用,
$(subst)
什么也没做。在第二种情况下,空间没有被消耗。但是,在我使用
$(subst)
的上下文中,这无关紧要,因为来自 $1
等变量的空格被保留(即空间剥离发生在扩展之前)。您可以通过以下方式看到:space :=
space +=
$(subst $(space),,the quick brown)
这会在
space
中放置一个空格字符,然后使用它从 the quick brown
中删除空格。所以,我相信
x
是不必要的。关于string - GMSL seq 函数的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37469553/