【问题标题】:Are C preprocessor statements a part of the C language?C 预处理器语句是 C 语言的一部分吗?
【发布时间】:2013-06-13 11:51:53
【问题描述】:

我记得我的一位教授在 C 入门课程中提出的主张。他表示#define 预处理器命令使程序员能够创建一个常量以供以后的代码使用,并且该命令是C 语言的一部分

/* Is this truly C code? */
#define FOO 42

由于是编程入门课,我怀疑他只是在简化源文件和编译器之间的关系,但我还是想验证一下我的理解。

预处理器语句是完全独立于 C 语言(取决于所使用的特定编译器)还是在 C99 标准中明确描述?出于好奇,K&R 有没有提到过预处理器宏?

【问题讨论】:

  • (我有一份@denull 发现的早期草稿。)但是,在某些环境中,预处理器与编译器分开使用,并且某些语言可以间接使用它。有一个 Perl 模块可以调用 C 预处理器作为 Perl 文件的过滤器。
  • 值得指出的是,“C 标准/语言”现在是 C11(这是 devnull 链接中的版本)。 C99 落后一位。当然更好的兼容性。

标签: c standards c99 c-preprocessor


【解决方案1】:

是的,预处理器 C 语言的一部分。从概念上讲,它是在编译源代码之前运行的。

除了常量定义,预处理器还用于实现两个非常重要的结构:

  1. #include 将其他文件带入编译单元。

  2. 包括警卫;即模式,

    #if !defined(METAWORD)
    #define METAWORD 1
    /* struct definition, function prototype */
    #endif
    

出于兴趣,这两种用法已经存在于 C++ 中,常量定义可以通过其他(更好的?)方式实现。

【讨论】:

    【解决方案2】:

    预处理器确实是 C 和 C++ 标准的一部分(C++ 标准中的第 16 章)并且标准描述了预处理器和语言如何交互(例如,重新#define C 关键字是非法的)。

    但是,C 预处理器可以与 C 以外的其他语言一起用于任何类型的简单文件预处理(例如,我已经看到它与 LaTeX 文件一起使用)。

    【讨论】:

    • #define 一个 C 关键字并不违法,前提是当您 #include 标准头文件或使用标准头文件 (7.1.2p4) 中的宏时定义无效.遵守第二个禁令有点复杂,因为几乎所有标准库名称都可以用宏实现,但需要一些工作才能实现。 (例如,标准库函数对应的#undefine宏是合法的。) 时隔多年才添加这条评论;我被另一个问题的评论引导到这个答案。
    【解决方案3】:

    是的,标准描述了预处理器。它是 C 语言的标准化部分。

    请注意,#include 是代码模块化所必需的,它是一个预处理器指令。

    publically-available draft of the C99 standard 中,预处理器在第 6.10 节中描述。​​

    【讨论】:

    • GCC 的预处理器实现是标准的超集,还是严格遵守?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多