为什么包括不以分号结尾的行?

zla*_*ack 11 c

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

Jus*_*eff 18

同样的原因#define宏没有 - 它们用于预处理器,它在编译器正确接管之前扩展了包含和定义之类的东西.

  • 更多定义 - 预处理器在编译器运行之前运行,并且它会替换文本.#include语句将替换为引用文件的内容.将#define输入到查找表中,然后在代码中看到define时,将其替换为存储的值等等.事实上,您可以使用另一个预处理器而不是标准的预处理器,但很少人们在现实世界中这样做. (4认同)

Ali*_*man 10

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


AnT*_*AnT 7

"......而其他声明".

首先,预处理程序指令不是语句.Statement是仅存在于语法/语义级别的实体.在任何语法分析开始之前,预处理器指令在翻译的相对早期阶段进行处理,因此在那个阶段还没有"声明"这样的东西.而且,由于这个原因,要求以#include分号结束指令没有任何有意义的理由.事实上,按照定义,预处理程序指令占用整行,这意味着它们已经被换行符终止.任何额外的终结器都是多余的.

其次,并非所有"其他声明"都以分号结尾.例如,复合语句没有

i = 5;

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

i = 15;
Run Code Online (Sandbox Code Playgroud)