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 函数
  • 两个字符串分别对应xy变量
  • 0 对应空字符串,在Make
  • 中逻辑为false
    - 是可交换的,所以 x - y = y - x

    那么,是否有理由执行此函数来评估 (x - y) + (y - x) = 0

    最佳答案

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

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

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

    当测试字符串 aaaaaa 时,因为 $(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/

    10-13 07:10