在哪里可以找到C语言中标识符的最大长度?
在哪个头文件中指定了该限制?
332nm8kg1#
没有包含标识符长度限制的头文件;即使有,它又能帮到你什么呢?无论如何,你不能在编译时根据头文件中的值来改变你的标识符长度。C standard的www.example.com部分5.2.4.1指出:
它还包含一个脚注:实现应该尽可能避免强加固定的转换限制。因此,您应该检查您的文档,看看您的编译器是否支持在标识符中使用更多的有效字符。
9jyewag02#
没有标头告诉你。你必须根据你可能移植到的平台做出明智的决定。Carl Norum指出了C99标准的内容。曾几何时,对于外部变量,您只能依赖于6个唯一的字符,并且是单大小写的--因为这是某些大型机环境所提供的(这是C89标准所规定的--但它指出这种限制是痛苦的)。如今,部分由于C++中的类型安全链接,你可以合理地依赖于更长的外部符号名称。如果你开始超过31个字符,你可能会遇到问题--但你也会遇到可读性问题。
uubf1zoe3#
因为在一些奇怪的极端情况下,让代码意识到这个限制是很有帮助的,所以下面是一个可以放在头文件中的方法(尽管看起来很难看):
#define SOMEREALLYREALLY...REALLYLONGNAME 1 #if SOMEREALLYREALLY #define MAXIDENT 16 #elif SOMEREALLYREALLYR #define MAXIDENT 17 #elif SOMEREALLYREALLYRE #define MAXIDENT 18 ...and so on
最后,如果编译器不进行截断,#ifs将命中截断的标识符或完整标识符
mlnl4t2r4#
简而言之,不存在头文件来告诉你,这是ANSI/ISO C标准规范的一部分,该规范定义了C语言本身的语法和环境机制的布局。在C89之前的标准中,最大标识符长度是6,这是由于小内存占用和诸如大型机和 *nix系统等系统上的环境。今天,最新的标准是C99标准,它规定标识符的最大长度为32,原因很简单,也很符合逻辑...编译器通过解析输入流来工作,输入流将作为命令行参数、makefile或解决方案传递(适用于Microsoft Visual Studio环境),解析器是严格和固定的,因此对标识符的长度施加了限制,以便解析器可以向前看,看看是否还有更多的字符.It“原因就在于此。另一个原因是大多数C++编译器在标识符上使用名称损坏,正如Jonathan Leffler指出的,这可能会混淆编译器和代码的链接。
thigvfpy5#
听起来你真正想要的是一个宏,你可以用#if或#ifdef来决定标识符的长度。您需要的宏是__STDC_VERSION__,它最早是在C99中定义的(如果您想更确定旧的编译器没有因为某种原因定义该宏,那么您可以使用#if __STDC_VERSION__ >= 199901L来代替#ifdef __STDC_VERSION__)。C99也是提高C编译器应该支持的标识符最小长度的同一标准。例如,外部标识符应该处理的最小长度为32个字符而不是6个字符。但是我鼓励你记住,首先,名字是一个API,有时甚至是ABI的表面!所以也许不要根据编译器的属性来改变名字!如果我写的代码使用你的库,而你让你的库像那样改变名字,我必须模仿你的标签大小测试。现在我的代码必须有一堆选择不同名字的预处理器指令!通常,如果您的 * 用户 *(其他开发人员和从源代码构建的人员)需要与具有此类限制的旧编译器或系统兼容,则应该根据他们能够定义的宏来更改它。因此,通常最好选择一个清晰的宏名称,如MYLIBRARY_SHORT_NAMES、#ifdef或#if。将其记录在文档中,也许是“可移植性”部分,以方便需要短名称的用户。记录普通名称和短名称所需的最少有效字符。并让您的用户在极少数需要的情况下从那里解决问题。
#if
#ifdef
__STDC_VERSION__
#if __STDC_VERSION__ >= 199901L
#ifdef __STDC_VERSION__
MYLIBRARY_SHORT_NAMES
5条答案
按热度按时间332nm8kg1#
没有包含标识符长度限制的头文件;即使有,它又能帮到你什么呢?无论如何,你不能在编译时根据头文件中的值来改变你的标识符长度。
C standard的www.example.com部分5.2.4.1指出:
它还包含一个脚注:
实现应该尽可能避免强加固定的转换限制。
因此,您应该检查您的文档,看看您的编译器是否支持在标识符中使用更多的有效字符。
9jyewag02#
没有标头告诉你。你必须根据你可能移植到的平台做出明智的决定。Carl Norum指出了C99标准的内容。
曾几何时,对于外部变量,您只能依赖于6个唯一的字符,并且是单大小写的--因为这是某些大型机环境所提供的(这是C89标准所规定的--但它指出这种限制是痛苦的)。
如今,部分由于C++中的类型安全链接,你可以合理地依赖于更长的外部符号名称。如果你开始超过31个字符,你可能会遇到问题--但你也会遇到可读性问题。
uubf1zoe3#
因为在一些奇怪的极端情况下,让代码意识到这个限制是很有帮助的,所以下面是一个可以放在头文件中的方法(尽管看起来很难看):
最后,如果编译器不进行截断,#ifs将命中截断的标识符或完整标识符
mlnl4t2r4#
简而言之,不存在头文件来告诉你,这是ANSI/ISO C标准规范的一部分,该规范定义了C语言本身的语法和环境机制的布局。在C89之前的标准中,最大标识符长度是6,这是由于小内存占用和诸如大型机和 *nix系统等系统上的环境。
今天,最新的标准是C99标准,它规定标识符的最大长度为32,原因很简单,也很符合逻辑...编译器通过解析输入流来工作,输入流将作为命令行参数、makefile或解决方案传递(适用于Microsoft Visual Studio环境),解析器是严格和固定的,因此对标识符的长度施加了限制,以便解析器可以向前看,看看是否还有更多的字符.It“原因就在于此。
另一个原因是大多数C++编译器在标识符上使用名称损坏,正如Jonathan Leffler指出的,这可能会混淆编译器和代码的链接。
thigvfpy5#
听起来你真正想要的是一个宏,你可以用
#if
或#ifdef
来决定标识符的长度。您需要的宏是
__STDC_VERSION__
,它最早是在C99中定义的(如果您想更确定旧的编译器没有因为某种原因定义该宏,那么您可以使用#if __STDC_VERSION__ >= 199901L
来代替#ifdef __STDC_VERSION__
)。C99也是提高C编译器应该支持的标识符最小长度的同一标准。例如,外部标识符应该处理的最小长度为32个字符而不是6个字符。
但是我鼓励你记住,首先,名字是一个API,有时甚至是ABI的表面!所以也许不要根据编译器的属性来改变名字!如果我写的代码使用你的库,而你让你的库像那样改变名字,我必须模仿你的标签大小测试。现在我的代码必须有一堆选择不同名字的预处理器指令!
通常,如果您的 * 用户 *(其他开发人员和从源代码构建的人员)需要与具有此类限制的旧编译器或系统兼容,则应该根据他们能够定义的宏来更改它。
因此,通常最好选择一个清晰的宏名称,如
MYLIBRARY_SHORT_NAMES
、#ifdef
或#if
。将其记录在文档中,也许是“可移植性”部分,以方便需要短名称的用户。记录普通名称和短名称所需的最少有效字符。并让您的用户在极少数需要的情况下从那里解决问题。