C语言 最大标识符长度

wz1wpwve  于 2023-03-01  发布在  其他
关注(0)|答案(5)|浏览(286)

在哪里可以找到C语言中标识符的最大长度?

在哪个头文件中指定了该限制?

332nm8kg

332nm8kg1#

没有包含标识符长度限制的头文件;即使有,它又能帮到你什么呢?无论如何,你不能在编译时根据头文件中的值来改变你的标识符长度。
C standard的www.example.com部分5.2.4.1指出:

  • 内部标识符或宏名称中的63个有效首字符(每个通用字符名称或扩展源字符被视为单个字符)
  • 外部标识符中的31个有效首字母(指定短标识符0000 FFFF或更短的每个通用字符名被视为6个字符,指定短标识符00010000或更长的每个通用字符名被视为10个字符,每个扩展源字符被视为与相应通用字符名相同数量的字符(如果有))

它还包含一个脚注:
实现应该尽可能避免强加固定的转换限制。
因此,您应该检查您的文档,看看您的编译器是否支持在标识符中使用更多的有效字符。

9jyewag0

9jyewag02#

没有标头告诉你。你必须根据你可能移植到的平台做出明智的决定。Carl Norum指出了C99标准的内容。
曾几何时,对于外部变量,您只能依赖于6个唯一的字符,并且是单大小写的--因为这是某些大型机环境所提供的(这是C89标准所规定的--但它指出这种限制是痛苦的)。
如今,部分由于C++中的类型安全链接,你可以合理地依赖于更长的外部符号名称。如果你开始超过31个字符,你可能会遇到问题--但你也会遇到可读性问题。

uubf1zoe

uubf1zoe3#

因为在一些奇怪的极端情况下,让代码意识到这个限制是很有帮助的,所以下面是一个可以放在头文件中的方法(尽管看起来很难看):

#define SOMEREALLYREALLY...REALLYLONGNAME 1
#if SOMEREALLYREALLY
#define MAXIDENT 16
#elif SOMEREALLYREALLYR
#define MAXIDENT 17
#elif SOMEREALLYREALLYRE
#define MAXIDENT 18
...and so on

最后,如果编译器不进行截断,#ifs将命中截断的标识符或完整标识符

mlnl4t2r

mlnl4t2r4#

简而言之,不存在头文件来告诉你,这是ANSI/ISO C标准规范的一部分,该规范定义了C语言本身的语法和环境机制的布局。在C89之前的标准中,最大标识符长度是6,这是由于小内存占用和诸如大型机和 *nix系统等系统上的环境。
今天,最新的标准是C99标准,它规定标识符的最大长度为32,原因很简单,也很符合逻辑...编译器通过解析输入流来工作,输入流将作为命令行参数、makefile或解决方案传递(适用于Microsoft Visual Studio环境),解析器是严格和固定的,因此对标识符的长度施加了限制,以便解析器可以向前看,看看是否还有更多的字符.It“原因就在于此。
另一个原因是大多数C++编译器在标识符上使用名称损坏,正如Jonathan Leffler指出的,这可能会混淆编译器和代码的链接。

thigvfpy

thigvfpy5#

听起来你真正想要的是一个宏,你可以用#if#ifdef来决定标识符的长度。
您需要的宏是__STDC_VERSION__,它最早是在C99中定义的(如果您想更确定旧的编译器没有因为某种原因定义该宏,那么您可以使用#if __STDC_VERSION__ >= 199901L来代替#ifdef __STDC_VERSION__)。
C99也是提高C编译器应该支持的标识符最小长度的同一标准。例如,外部标识符应该处理的最小长度为32个字符而不是6个字符。
但是我鼓励你记住,首先,名字是一个API,有时甚至是ABI的表面!所以也许不要根据编译器的属性来改变名字!如果我写的代码使用你的库,而你让你的库像那样改变名字,我必须模仿你的标签大小测试。现在我的代码必须有一堆选择不同名字的预处理器指令!
通常,如果您的 * 用户 *(其他开发人员和从源代码构建的人员)需要与具有此类限制的旧编译器或系统兼容,则应该根据他们能够定义的宏来更改它。
因此,通常最好选择一个清晰的宏名称,如MYLIBRARY_SHORT_NAMES#ifdef#if。将其记录在文档中,也许是“可移植性”部分,以方便需要短名称的用户。记录普通名称和短名称所需的最少有效字符。并让您的用户在极少数需要的情况下从那里解决问题。

相关问题