gpt4 book ai didi

c++ - C 标识符名称 : What goes with which compiler?

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:28 24 4
gpt4 key购买 nike

我正在试验 externextern "C" 一段时间,不小心在其中一个标识符中输入了错误 - $ 偷偷溜进来了。当我编译代码并得到一个 undefined symbol 的错误并最终看到导致它的原因时,这让我很好奇它是否真的可以编译。你猜怎么着 - Clang 实际上确实编译了它。

根据我之前阅读的文档,标识符的规则基本上是:

  • 开头没有双下划线 - 因为它们是保留的。
  • 没有单个下划线和大写字母 - 也保留。
  • 必须以字母、非数字开头。
  • 不得超过 31 个字符。
  • 可能包含 a-zA-Z0-9_

但这编译得很好 - 也没有显示警告:

void __this$is$a$mess() {}
int main() { __this$is$a$mess(); }

看的时候:

Ingwie@Ingwies-Macbook-Pro.local /tmp $ clang y.c
Ingwie@Ingwies-Macbook-Pro.local /tmp $ nm a.out
0000000100000f90 T ___this$is$a$mess
0000000100000000 T __mh_execute_header
0000000100000fa0 T _main
U dyld_stub_binder

我可以很清楚地看到符号名称。

那么为什么 Clang 会让我这样做,尽管按照 ANSI 标准,它不应该这样做?即使是我安装的 GCC 6 也没有关于此的警告或错误。

哪些编译器将允许使用哪些类型的标识符 - 为什么?

最佳答案

2018 C 标准中标识符的规则包括:

  • 根据 6.4.2.1 1,identifieridentifier-nondigitdigit 字符的序列,以 identifier 开头-非数字
  • identifier-nodigit_azA Z通用字符名称,或“其他实现定义的字符”。
  • 一个数字09
  • universal-character-name\u 后跟四个十六进制数字或 \U 后跟八个十六进制数字,指定 Unicode字符。

因此,如果一个实现允许 $,那么它就是该实现的有效字符。您可以使用它,但它可能无法移植到其他实现。 C 标准要求实现接受列出的特定字符,但它允许它们接受更多。一般来说,C 标准应该被视为一个开放的领域而不是一个围墙花园:行为是在领域内定义的,但你不会停在障碍处;您可以超越它,风险自负。

你学到的规则是可移植的规则,而不是 C 标准要求实现限制你的规则。

C 标准定义了严格符合代码,粗略地说,代码应该在任何 C 实现中工作,符合代码,这是在任何 C 实现中工作的代码至少一个 C 实现。符合规范的代码仍然是 C 代码。所以你学到的规则是严格遵守代码。

通常,您应该更愿意编写严格符合标准的代码,并且只在 yield (速度、特定平台上的开发便利性等)值得付出代价(失去可移植性)时才使用附加功能。

关于c++ - C 标识符名称 : What goes with which compiler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54449184/

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