我正在阅读GCC C预处理器 - >标记化,其中提到
预处理令牌分为五大类:
- 标识符
- 预处理数字
- 字符串文字
- 标点符号
- 其他。
醇>任何其他单个字符都被视为“其他”。 它被传递给预处理器的输出不受干扰。 C编译器几乎肯定会拒绝包含“其他”令牌的源代码。 在ASCII中,唯一的其他字符是'@','$','`'和其他控制字符 比NUL(所有位为零)。
我也在浏览网页,我遇到了'C字符集',他们在其中提到'@'作为角色之一。 提到'@'作为'C字符集'之一的文章是错的吗?或者我的理解是错的?
感谢。
答案 0 :(得分: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:基本源字符集成员的字形 用于识别ISO / IEC 10646子集中的字符 它对应于ASCII字符集。但是,因为 从源文件字符映射到源字符集 (在翻译阶段1中描述)被指定为 实现定义,需要一个实现来记录如何 基本源字符在源文件中表示。
答案 1 :(得分:1)
我不确定你的问题是否完全清楚。这俩
C和C ++标准要求编译器支持所有
Unicode中的字符,但不一定在
透明的方式:编译器如何将输入映射到其中
内部字符集是实现定义的。但是这个
定义,所有编译器都必须接受@
,$
,
等
你可以对任何特定角色做些什么是不同的
问题,并且有很多字符(例如@
和$
)
它只能出现在注释,字符串文字或
一个字符文字(解析为预处理器编号)
你引用的文字)。例如,符号可能只包含_
和Unicode类型为字母或数字的字符
(粗略地说 - 标准确切地说明了什么
字符是和不允许的)。
因为实现如何映射中的字符
输入到源字符集是实现定义的,
编译器可以映射0x40(在ASCII,Latin-1中为@
或Unicode)到其他允许的其他字符
一个符号。我不知道有什么走这条路;我猜测,
事实上,那个想要允许@
或$
的编译器
一个符号只会选择不符合,而不是
不可能将字符放在字符串文字中。
答案 2 :(得分:0)
我认为你的意思是你设置LANG=C
时得到的字符集?
这根本不是一回事。这是一个 locale ,它基本上只是说“使用ASCII”而没有特殊的附加功能。它不需要额外的翻译文件或终端支持。它只是意味着你得到了所有东西的默认输出。
或者,也许你真的是指可能出现在C程序中的字符集?
不要忘记C程序可能会在引号内使用这些字符。仅仅因为它们在任何语言关键字或变量中都没有意义并不意味着它们不能存在于文件中。另一方面,例如,在C字符串中包含UTF-8字符可能是错误的。
仅仅因为角色在C程序中有效,并不意味着它在任何地方都有效。例如,if
关键字在函数外部无效。