【问题标题】:Non-ASCII characters in CC中的非ASCII字符
【发布时间】:2012-01-23 17:59:23
【问题描述】:

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

谢谢!

【问题讨论】:

  • 通过查看示例,我刚刚意识到该符号仅出现在运行时和其他名称之间(runtime·cgocallruntime·throwruntime·allm)。
  • @pmg:用作命名空间标识符,我觉得很聪明,很酷,用起来很不方便。
  • 嗯,这 确实 似乎是在 ANSI C 中模拟命名空间的一种非常聪明的方法。希望答案能探索这样做的任何注意事项,而不仅仅是告诉你是什​​么角色。
  • @CodyGray 是的,我就是这么想的。真的很干净:)
  • 它真的很干净...对于 C 代码生成器 :)

标签: c namespaces naming-conventions ansi standards-compliance


【解决方案1】:

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

【讨论】:

  • 在ANSI标准中有定义吗?
  • @Waneck:在扩展字符集中,它是ascii-table.com/ansi-codes.php。 ANSI 编号 183。
  • 我的意思是 ANSI C 标准:)
  • 据我所知,中间的点在格鲁吉亚语中不使用,它在加泰罗尼亚语中用于ls 之间,以区分lll·l 的不同发音。
【解决方案2】:

The C99 Standard "allows" (对于足够小的 "allow" 值) '奇怪的字符'

5.1.1.2 翻译阶段

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

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

【讨论】:

    【解决方案3】:

    这里讨论使用中间点:

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

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

    【讨论】:

    • 我不明白。如何/为什么需要引导系统?您是在谈论 Go 语言,而不是问题链接的 C 代码?
    • 我认为这个问题与 google go 的标识符有关,而不是 C 标识符。这就是为什么他们必须谈论引导编译器的原因。
    • 我的理解是,由于已经存在使用中间点的函数,Go 需要在 cgocall.c 中使用该中间点调用这些函数才能调用。跨度>
    【解决方案4】:

    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 编译器 could handle other characters 在标准化之前。

    【讨论】:

    • 即使在标识符中?还是只在字符串内部?
    • 即使在标识符中。请参阅我刚刚添加的报价。
    • 嗯,是的。这让我觉得微软的 C 编译器也无法处理它,因为他们从不费心支持 C99。
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2013-07-13
    • 2012-04-28
    • 2014-06-12
    • 2010-10-18
    • 2012-12-31
    • 2013-06-19
    相关资源
    最近更新 更多