ld 错误消息:为什么第一个单引号实际上是反引号?

问题描述 投票:0回答:1

如果您查看

ld
生成的错误消息,请看以下示例(取自 此答案):

/home/AbiSfw/ccvvuHoX.o: In function `main':
prog.cpp:(.text+0x10): undefined reference to `x'
prog.cpp:(.text+0x19): undefined reference to `foo()'
prog.cpp:(.text+0x2d): undefined reference to `A::~A()'

可以看到单引号不平衡,应该是第一个单引号(

'
)实际上是反引号(
`
)。

这是为什么呢?有具体原因吗,还是历史错误?这是否曾被记录为 UI 错误?它是否从未被修复过,因为现在修复它已经太晚了,因为现在修复它会导致生成的错误不匹配?

我希望错误消息看起来像这样:

/home/AbiSfw/ccvvuHoX.o: In function 'main':
prog.cpp:(.text+0x10): undefined reference to 'x'
prog.cpp:(.text+0x19): undefined reference to 'foo()'
prog.cpp:(.text+0x2d): undefined reference to 'A::~A()'

现在单引号已经平衡了。

error-handling ld
1个回答
0
投票

看起来像是一个“不是关于编程”的问题 - 但是 以一种有趣的历史方式。任何令人费解的怪癖 像 ld 这样的古老工具最初可能与编程有关。

使用

`...'

ld

的诊断中引用引号并不是一个从未修复过的错字, 这是故意的。这种不匹配引号的风格至少可以追溯到 20 世纪 70 年代的程序员 在我职业生涯的前十年里,这仍然是常见的程序员风格, 1985年以后。我将调用这些

M4 风格的引号
,以避免必须在内联 Markdown 中格式化它们, 我不知道该怎么做。 无论过去还是现在,考虑任何日志记录或诊断文本都是一种很好的形式 您导致程序的输出很容易被输入到其他敏感的程序或脚本中 引用和/或外壳扩展,并且应该适当地

clean

。所以我们避免了,我希望仍然避免, 输出 假反引号扩展引号, `this is not a command`

或多种引用风格,或撇号所有格(“Bob's Whippet”)或
撇号缩写(“这是一只惠比特犬”),因为这样的污染物会导致解析失败
引言(“鲍勃的惠比特犬在地狱里没有滚雪球的机会”)。

使用 M4 样式引号也是一种很好的形式,因为它们使 相当强大的报价解析比匹配报价便宜得多。他们用简洁的文字 使引用开始和结束引用与上下文无关。它 当计算资源非常便宜时,现在可能看起来很荒谬;但是当计算资源时 每条指令的成本比现在高 1000 倍,速度也比现在慢 1000 倍, 像这样的吝啬经济在编程文化中普遍存在并受到尊重,但其中一些在某些地方已经成为化石。

当考虑嵌套引用时,M4 样式将其领先优势延伸到

'...'

风格。比较:

'Amy said 'Bob whispered 'Cathy is a fool' to Dave', according to Edith'

和:

`Amy said `Bob whispered `Cathy is a fool' to Dave', according to Edith'

'...'

,不确定是否有3个引号,没有嵌套, 由不带引号的文本分隔,或 3 个引号,其中第二个和第三个分别嵌套在其前任中:不是 除非您部署额外且不太可靠的语法,而不仅仅是:

内容
'...'
在引用中
。对于 M4 风格,第二个解析是唯一的。 在现代程序员的工作中,这似乎不是一个重要的考虑因素, 但从历史上看,对于许多程序员来说,这是一个重要的事件

M4 宏处理语言

的鼎盛时期, 由 Brian Kernighan 和 Dennis Ritchie 发明(在本发明中也很突出) Unix 和许多其他持久的 Unix 工具)。 M4 默认情况下识别 M4 风格的字符串引用,因为它在嵌套中很便宜且明确,这一事实对程序员产生了广泛的风格影响,其形式可能是:“默认情况下,我生成干净的文本,就好像 M4 是将消耗它”,或者进一步删除,“默认情况下,我以真正的程序员的方式生成干净的文本”。 我确信除了我使用的 ld 之外,还有其他工具仍然会发出 M4 风格的引号,但没有一个出现在我的脑海中。也许是 一个错觉。

顺便说一句,M4

还没有死
:它仍然是 GNU 自动工具和每个自动工具包的一部分 如果只是作为 M4 宏的使用者,构建者将会遇到它。

© www.soinside.com 2019 - 2024. All rights reserved.