C预处理器语句是C语言的一部分吗?

C预处理器语句是C语言的一部分吗?,c,standards,c99,c-preprocessor,C,Standards,C99,C Preprocessor,我记得我的一位教授在一门C入门课程中提出的一个主张。他说,#define预处理器命令使程序员能够创建一个常量,以便在以后的代码中使用,并且该命令是C语言的一部分 /* Is this truly C code? */ #define FOO 42 由于这是在一个介绍性编程课程中,我怀疑他只是在简化源文件和编译器之间的关系,但我还是希望验证我的理解 预处理器语句是否完全独立于C语言(取决于使用的特定编译器),还是在C99标准中明确描述?出于好奇,K&R提到过预处理器宏吗?是的,标准描述了预处理器

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

/* Is this truly C code? */
#define FOO 42
由于这是在一个介绍性编程课程中,我怀疑他只是在简化源文件和编译器之间的关系,但我还是希望验证我的理解


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

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

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


在中,第6.10节介绍了预处理器。

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

与常量定义一起,预处理器用于实现两个非常重要的构造:

  • #包含
    ,将其他文件带入编译单元

  • 包括警卫;i、 e.模式

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

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

    < P>预处理器确实是C和C++标准的一部分(C++标准中的第16章),标准描述了预处理器和语言之间的相互作用。(例如,重新定义C关键字是非法的)


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

    See(我有一个@denull发现的早期草稿。)但是,在某些环境中,预处理器可以与编译器分开使用,某些语言可以间接使用它。有一个Perl模块可以调用C预处理器作为Perl文件的过滤器。值得指出的是,“C标准/语言”现在是C11(这是devnull链接中的版本).C99是后面的一个。当然为了更好的兼容性。GCC的预处理器实现是标准的超集,还是严格遵守?定义C关键字并不违法,前提是当您包含标准标题或使用标准标题中的宏(7.1.2p4)时定义无效。第二个禁止有点复杂,因为几乎所有标准库名称都可以用宏实现,但也可以通过一些工作来实现。(例如,取消定义与标准库函数对应的宏是合法的。)很抱歉在这么多年后添加了此评论;我是通过另一个问题的评论得出此答案的。