为什么在预处理程序指令之后没有分号?
如果我写
#include ;
没有错误,但在编译期间会出现警告
pari.c:1:18:警告:#include指令末尾有额外的令牌
是什么原因 ?
原因是预处理程序指令不使用分号。 这是因为它们使用换行符来分隔语句。 这意味着每行不能有多个指令:
#define ABC #define DEF // illegal
但是你可以用一个\(或/,我忘了)结束每一行(除了最后一行),在多行上有一个。
因为预处理程序指令是包含在程序代码中的行,这些代码不是程序语句,而是预处理程序的指令。
这些预处理程序指令仅扩展到一行代码。 一旦找到换行符,就会认为预处理程序指令结束。 这就是为什么在预处理器指令结束时不需要分号(;)的原因。
预处理程序指令是一种与C语言不同的语言,并且具有更简单的语法,因为最初它们是“解析”的,如果你可以在C编译器看到文件之前通过一个名为cpp
的不同程序来调用它。 人们可以使用它来预处理甚至非C文件以包括配置文件的条件部分等。
有一个名为“unifdef”的Linux程序,如果你知道它们永远不会是真的,你仍然可以用来删除一些程序的条件部分。 例如,如果你有一些代码支持#ifdef ANSI/#else/#end
#ifndef ANSI/#end
或#ifndef ANSI/#end
包围的非ANSI标准编译器,你知道你将永远不再需要支持非ANSI ,你可以通过unifdef -DANSI
运行它来消除死代码。
因为它们是不必要的。 预处理程序指令仅存在于一行中,除非您明确使用行继续符(例如,对于大宏)。
如果你使用#define MACRO(para) fun(para);
将半导体置于其后可能是错误的。
if (cond) MACRO (par1); else MACRO (par2);
导致语法错误
在编译期间,您的代码由两个独立的程序处理,即预处理器和编译器。 预处理器首先运行。
您的代码实际上由两种语言组成,一种语言叠加在另一种语言之上。 预处理器处理一种语言,这是所有以“#”开头的指令(以及这些指令的含义)。 它处理“#include”,“#define”和其他指令,并保持其余的代码不受影响(除非作为预处理器指令的副作用,如宏替换等)。
然后编译器出现并处理预处理器生成的输出。 它处理“C”语言,几乎忽略了预处理器指令。
你的问题的答案是“#include”是预处理器处理的语言的一部分,用这种语言“;” 不是必需的,实际上是“额外令牌”。