1

我正在阅读 GCC C 预处理器 -> 标记化,其中提到

预处理令牌分为五类:

  1. 身份标识
  2. 预处理数字
  3. 字符串文字
  4. 标点符号
  5. 其他。

任何其他单个字符都被视为“其他”。它不受干扰地传递到预处理器的输出。C 编译器几乎肯定会拒绝包含“其他”标记的源代码。在 ASCII 中,仅有的其他字符是“@”、“$”、“`”和除 NUL 之外的控制字符(所有位为零)。

我也在浏览网页时遇到了“C 字符集”,其中他们提到了“@”作为字符之一。提到“@”作为“C 字符集”之一的文章是错误的吗?还是我的理解有误?

谢谢。

4

3 回答 3

2

有一些编译器允许“额外”字符,例如 @ 或 $ 作为标识符的一部分。这不是标准的一部分,而是扩展。从内存中,它在 C++ 标准中以某种方式提到“编译器可能会添加额外的字符”。

第 2.3 节:

基本源字符集由 96 个字符组成:空格字符、代表水平制表符、垂直制表符、换页符和换行符的控制字符,以及以下 91 个图形字符:(14)

a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ∼ ! = , \ " ’

(注 14:基本源字符集成员的字形旨在识别对应于 ASCII 字符集的 ISO/IEC 10646 子集中的字符。但是,因为从源文件字符到源字符集的映射(在翻译阶段 1 中描述)被指定为实现定义,需要实现来记录基本源字符在源文件中的表示方式。

于 2013-07-25T12:37:17.993 回答
1

我不确定你的问题是否完全清楚。C 和 C++ 标准都要求编译器支持 Unicode 中的所有字符,尽管不一定以透明的方式:编译器如何将输入映射到其内部字符集是实现定义的。但是根据这个定义,所有编译器都必须接受@,$等。

您可以对任何特定字符做什么是一个不同的问题,并且有很多字符(如@$)只能出现在注释、字符串文字或字符文字中(解析为文本中的预处理器编号)引用)。例如,符号可能只包含_ Unicode 类型为字母或数字的字符(粗略地说,该标准明确指定了哪些字符是允许的,哪些是不允许的)。

由于实现如何将输入中的字符映射到源字符集是实现定义的,因此编译器可以将 0x40(@在 ASCII、Latin-1 或 Unicode 中是 a)映射到符号中允许的某个其他字符。我不知道有哪家公司走这条路;实际上,我怀疑想要允许@$在符号中的编译器只会选择不符合标准,而不是使字符串文字中的字符不可能。

于 2013-07-25T12:59:20.847 回答
0

我想你的意思是你设置时得到的字符集LANG=C

那根本不是一回事。这是一个基本上只是说“使用 ASCII”而没有特殊附加功能的语言环境。它不需要额外的翻译文件或终端支持。这只是意味着您从所有内容中获取默认输出。


或者,也许您真的是指可能出现在 C 程序中的字符集?

不要忘记 C 程序可能会在引号内使用这些字符。仅仅因为它们在任何语言关键字或变量中没有含义并不意味着它们不能存在于文件中。另一方面,例如,在 C 字符串中包含 UTF-8 字符可能是错误的。

仅仅因为一个字符在 C 程序中有效,并不意味着它在任何地方都有效。例如,if关键字在函数之外无效。

于 2013-07-25T12:46:50.150 回答