代码之家  ›  专栏  ›  技术社区  ›  jxh

第一列需要#的编译器?

  •  0
  • jxh  · 技术社区  · 7 年前

    是否有广泛使用的前ANSI C编译器 这需要 # 在第一列?

    我会接受任何编译器 this list

    K&R C没有指定在 # . 从原件 C程序设计语言 ,附录A中“C参考手册”第12¶1节:

    C编译器包含一个预处理器,能够进行宏替换、条件编译和包含命名文件。以开头的行 与此预处理器通信。

    # 未指定。这意味着,如果指令没有从第一列开始,则ANSI之前的编译器可能无法编译程序。

    在ISO C(以及在此之前的ANSI C)中,C预处理指令被明确允许以空格作为前缀。在ANSI C(C-89)中:

    A. 预处理指令 由一系列预处理组成 # 预处理令牌,该令牌是 源文件中的第一个字符(可选在空白之后) 包含至少一个换行符,并以下一个换行符结束

    ISO C.2011有类似的语言,但进一步澄清:

    A. 由满足以下条件的预处理令牌序列组成: 以下约束:序列中的第一个令牌是 预处理令牌(在 翻译阶段4)的开始是源文件中的第一个字符(可选) 在不包含新行字符的空白之后)或在空白之后 序列中第一个标记后面的字符。 165) 新行字符结束 预处理指令,即使它发生在调用类似函数的宏中。
    165)因此,预处理指令通常称为行。这些行没有其他语法 重要性,因为除预处理过程中的某些情况外,所有空白都是等效的(请参见 # 例如,6.10.3.2中的字符串文字创建运算符)。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Steve Summit    7 年前

    简短回答:是的。

    我记得写过这样的东西

    #if foo
        /* ... */
    #else
    #if bar
        /* ... */
    #else
     #error "neither foo nor bar specified"
    #endif
    #endif
    

    这样,我曾经使用过的各种预ANSI编译器就不会抱怨“无法识别的预处理器指令#error”。这可能是Ritchie最初为pdp11或pcc编写的cc(“可移植C编译器”,IIRC是80年代左右Vax cc的基础)。这两种编译器——更准确地说,这两种编译器使用的预处理器——肯定需要 # 位于第一列。(实际上,尽管这些编译器非常不同,但它们可能都使用了基本相同的预处理器的不同变体,在那些日子里,预处理器总是一个单独的程序。)