为什么在预处理程序指令之后没有分号?

时间:2010-10-02 11:14:33

标签: c

如果我写

#include <stdio.h>;

没有错误,但在编译期间会出现警告

pari.c:1:18:警告:#include指令结束时的额外令牌

是什么原因?

6 个答案:

答案 0 :(得分:7)

原因是预处理程序指令不使用分号。这是因为它们使用换行符来分隔语句。这意味着每行不能有多个指令:

#define ABC #define DEF // illegal

但你可以通过用\(或/,我忘记)结束每一行(除了最后一行)来在多行中创建一个。

答案 1 :(得分:3)

因为预处理程序指令是程序代码中包含的行,这些行不是程序语句,而是预处理程序的指令。

这些预处理程序指令仅扩展到一行代码。一旦找到换行符,就会认为预处理程序指令结束。这就是为什么在预处理器指令结束时不需要分号(;)的原因。

答案 2 :(得分:3)

预处理器指令是一种与C语言不同的语言,并且具有更简单的语法,因为最初它们是“解析”的,如果你可以通过一个名为cpp的不同程序在C编译器看到它之前调用它。文件。人们可以使用它来预处理甚至非C文件,以包括配置文件的条件部分等。

有一个名为“unifdef”的Linux程序,如果您知道它们永远不会是真的,您仍然可以使用它来删除程序的某些条件部分。例如,如果您有一些代码支持由#ifdef ANSI/#else/#end#ifndef ANSI/#end包围的非ANSI标准编译器,并且您知道您将永远不再需要支持非ANSI,则可以消除通过unifdef -DANSI运行死代码。

答案 3 :(得分:2)

因为它们是不必要的。预处理程序指令仅存在于一行上,除非您明确使用行继续符(例如大宏)。

答案 4 :(得分:1)

如果你使用#define MACRO(para) fun(para);,可能会错误地将semikolon放在后面。

if (cond) 
  MACRO (par1);
else
  MACRO (par2);

会导致语法错误

答案 5 :(得分:1)

在编译期间,您的代码由两个独立的程序处理,即预处理器和编译器。预处理器首先运行。

您的代码实际上由两种语言组成,一种语言叠加在另一种语言之上。预处理器处理一种语言,这是所有以“#”开头的指令(以及这些指令的含义)。它处理“#include”,“#define”和其他指令,并保持其余的代码不受影响(除非作为预处理器指令的副作用,如宏替换等)。

然后编译器出现并处理预处理器生成的输出。它涉及“C”语言,几乎忽略了预处理器指令。

你的问题的答案是“#include”是预处理器处理的语言的一部分,用这种语言“;”不是必需的,实际上是“额外令牌”。