我记得我的一位教授在 C 入门课程中提出的一个主张。他表示,
#define
预处理器命令使程序员能够创建一个常量以在以后的代码中使用,并且该命令是C语言的一部分。
/* Is this truly C code? */
#define FOO 42
由于这是入门编程课程,我怀疑他只是简化了源文件和编译器之间的关系,但尽管如此,我还是想验证一下我的理解。
预处理器语句是否完全独立于 C 语言(取决于所使用的特定编译器),还是在 C99 标准中明确描述?出于好奇,K&R 有没有提到过预处理器宏?
是的,该标准描述了预处理器。它是 C 语言的标准化部分。
请注意,
#include
对于代码模块化至关重要,它是一个预处理器指令。
在公开可用的 C99 标准草案中,预处理器在第 6.10 节中进行了描述。
预处理器确实是 C 和 C++ 标准的一部分(C++ 标准中的第 16 章),并且标准描述了预处理器和语言如何交互(例如,重新
#define
C 关键字是非法的)。
但是,C 预处理器可以与 C 以外的其他语言一起使用,以进行任何类型的简单文件预处理(例如,我见过它与 LaTeX 文件一起使用)。
是的,预处理器是 C 语言的一部分。从概念上讲,它是在编译源代码之前运行的。
与常量定义一起,预处理器用于实现两个非常重要的构造:
#include
将其他文件带入编译单元。
包括警卫;即模式,
#if !defined(METAWORD)
#define METAWORD 1
/* struct definition, function prototype */
#endif
出于兴趣,这两种用法已经保留到 C++ 中,常量定义可以通过其他(更好?)的方式实现。