C 中的非 ASCII 字符

问题描述 投票:0回答:4

我正在查看 google go 的运行时源代码(在 https://go.googlecode.com/hg/src/pkg/runtime/ ),他们似乎在函数名称中使用了一个特殊字符,·。 (例如 https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c)。这是否被主要编译器接受?这不是 ANSI C,是吗?或者它只是一些宏观魔法?

谢谢!

c namespaces naming-conventions non-ascii-characters standards-compliance
4个回答
5
投票

C90 不允许在标识符中添加其他字符(超过基本字符集中的字符),C99 允许(使用通用字符语法——\uXXXX 和 \UXXXXXXXX——以及实现定义的其他字符集)。

C99 中的

6.4.2.1/1:

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters
nondigit: one of
    _ 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
digit: one of
    0 1 2 3 4 5 6 7 8 9

我不知道 C 实现对它的支持程度如何,我知道 Plan9 C 编译器 在标准化之前可以处理其他字符


2
投票

你是说点吗?它是来自 ISO 8859-1 (ISO Latin-1) 的字符代码 183 - 它是一个扩展的 ASCII 代码(显然)对应于格鲁吉亚逗号,又名“中间点”。它实际上是一个法律字符。


1
投票

C99 标准“允许”(对于足够小的“允许”值)“奇怪字符”

5.1.1.2 翻译阶段

1 翻译的语法规则之间的优先级由以下指定 阶段。

  1. 物理源文件多字节字符被映射,在定义的实现中 方式,到源字符集(为 行尾指示器),如果需要的话。三字母序列被替换为 相应的单字符内部表示。

1
投票

这里讨论使用那个中间点:

http://code.google.com/p/go/issues/detail?id=793

基本上,使用那个点不是规范的一部分,但在某些情况下是必要的。引导程序、运行时或程序集。

© www.soinside.com 2019 - 2024. All rights reserved.