gpt4 book ai didi

comments - 变量赋值后的尾随注释颠覆比较

转载 作者:行者123 更新时间:2023-12-05 09:24:39 26 4
gpt4 key购买 nike

在 GNU make 中,附加到变量赋值的尾随注释会阻止后续比较(通过 ifeq)正常工作。

这是生成文件...

  A = a
B = b ## trailing comment
C = c

RESULT :=

ifeq "$(A)" "a"
RESULT += a
endif

ifeq "$(B)" "b"
RESULT += b
endif

ifeq "$(C)" "c"
RESULT += c
endif

rule:
@echo RESULT=\"$(RESULT)\"
@echo A=\"$(A)\"
@echo B=\"$(B)\"
@echo C=\"$(C)\"

这是输出...

$ make
RESULT=" a c"
A="a"
B="b "
C="c"

RESULT 的显示值可以看出,ifeq 受到 B 赋值中注释的影响.回显变量 B,表明问题不在于注释,而在于中间空格

显而易见的解决方案是显式 strip像这样比较之前的空白......

ifeq "$(strip $(B))" "b"
RESULT += b
endif

但是这似乎很容易出错。由于除非/直到使用注释,否则不需要 strip 操作,因此您可以省略 strip 并且一切最初都会正常工作 - 所以您很可能会'不要总是记得添加 strip。后来,如果有人在设置变量时添加了注释,Makefile 将不再按预期工作。

注意:有一个密切相关的问题,如 this question 中所示,即使没有注释,尾随空格也会破坏字符串比较。

问题:有没有更防呆的方法来处理这个问题?

最佳答案

这不是 GNU Make 特有的;相反,makedefined by POSIX to work this way :

string1 = [string2]

The macro named string1 is defined as having the value of string2, where string2 is defined as all characters, if any, after the <equals-sign>, up to a comment character (#) or an unescaped <newline>. Any <blank> characters immediately before or after the <equals-sign> shall be ignored.

这可以解释为允许您使用尾随空格清楚地创建变量的功能:

FOO = stuff  # this macro has two trailing spaces
BAR = something else# and this one has none

虽然通常重新组织您使用的地方可能会更清楚 $(FOO)而不是依赖于它有模糊的空格。

处理这个问题的最好方法可能就是避免它:制定一个约定,您不要在变量定义行上添加注释(除非偶尔有意明确显示空格)。而不是这样写:

A = a # list of apples
B = b # list of bananas
C = c # list of carrots

这样写:

# list of apples
A = a
# list of bananas
B = b
# list of carrots
C = c

这往往是 GNU 项目中的风格(例如参见 the bottom of this page ),但我不记得是否在任何地方记录了这一点。

顺便说一句,在检查空格时,您可能想在 echo 中引用变量。命令更多:

rule:
@echo 'RESULT="$(RESULT)"'

在你的echo RESULT=\"$(RESULT)\"版本,$(RESULT)没有从 shell 中引用,因此制表符和多个空格被误导性地显示为单个空格。

关于comments - 变量赋值后的尾随注释颠覆比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com