为什么include行不以分号结尾?

为什么include行不以分号结尾?,c,C,当包含库c时,行不以分号结尾,而其他语句以分号结尾。 这背后的原因是什么?同样的原因#define宏不是——它们是用于预处理器的,预处理器在编译器真正接管之前会展开include和define之类的内容。以a开头的行不是C语言本身的一部分,它们是用于预处理器的指令。最初设计时,不需要分号。\include是一个类似于\define的预处理命令#include告诉编译器在实际编译代码之前在源代码中包含指定的文件。“…而其他语句则会” 首先,预处理器指令不是语句。语句是仅存在于语法/语义级别的实体。

当包含库c时,行不以分号结尾,而其他语句以分号结尾。 这背后的原因是什么?

同样的原因#define宏不是——它们是用于预处理器的,预处理器在编译器真正接管之前会展开include和define之类的内容。

以a开头的行不是C语言本身的一部分,它们是用于预处理器的指令。最初设计时,不需要分号。

\include
是一个类似于
\define
的预处理命令
#include
告诉编译器在实际编译代码之前在源代码中包含指定的文件。

“…而其他语句则会”

首先,预处理器指令不是语句。语句是仅存在于语法/语义级别的实体。预处理器指令在翻译的相对早期阶段处理,在任何语法分析开始之前,所以在那个阶段还没有“语句”这样的东西。因此,要求用分号结束
#include
指令没有任何有意义的理由。事实上,预处理器指令按定义占据了整行,这意味着它们已经被新行字符终止。任何额外的终端都是多余的

其次,并非所有“其他语句”都以分号结尾。例如,一个复合语句就不能

i = 5;

{ /* <- compound statement begins here... */
  i = 10;
} /* <- ... and ends here. Note: no semicolon */

i = 15;
i=5;

{/*多一点定义-预处理器在编译器运行之前运行,并替换文本。一个#include语句被替换为引用文件的内容。一个#define被输入到一个查找表中,然后当在代码中看到该定义时,它被替换为存储值,等等使用另一个预处理器而不是标准的预处理器,但在现实世界中很少有人这样做。它不也是一个预处理器,可以执行类似\和连接断字符串文字这样的时髦行继续操作吗?@JustJeff:请看;连接字符串文字是在预处理之间的转换阶段6中完成的(第4阶段)和语义分析/汇编(第7阶段),因此您可以在预处理器或编译器中自由地执行此操作;在第2阶段,在预处理器正常工作之前,沿尾部反斜杠连接行。我为您设置了格式;当您键入答案时,您可以查看文本框下方的预览,以查看其外观。#是一个格式字符,因此您需要以某种方式保护它。