回答
原因是预处理程序指令不使用分号。这是因为他们使用换行符来分隔语句。这意味着,你不能有每行多个指令:
#define ABC#define DEF // illegal
但是你可以通过结束每一行(除了最后一个),用\有一个在多行(或/,我忘了)。
因为它们是不必要的。预处理器指令只存在于一行中,除非您明确使用了行续字符(例如对于一个大宏)。
因为预处理器指令是包含在程序代码中的行,它们不是程序语句,而是预处理程序的指令。
这些预处理指令只在单行代码中扩展。只要找到换行符,预处理器指令就会结束。这就是为什么预处理器指令末尾没有分号(;)的原因。
预处理器指令与C语言不同,语法也更简单,因为最初在C编译器看到文件之前,它们被“解析”,如果可以调用它,则由另一个名为cpp
的程序进行调用。人们可以使用它来预处理甚至非C文件,以包括配置文件等的条件部分。
有一个名为“unifdef”的Linux程序,如果您知道它们永远不会是真的,您仍然可以使用它来删除程序的某些条件部分。例如,如果您有一些代码支持包含#ifdef ANSI/#else/#end
或#ifndef ANSI/#end
的非ANSI标准编译器,并且您知道不再需要支持非ANSI,则可以通过运行unifdef -DANSI
来消除死代码。
如果你使用#define MACRO(para) fun(para);
可能是错误的,在它后面放一个半分符。
if (cond)
MACRO (par1);
else
MACRO (par2);
导致了语法错误
在编译期间,您的代码是由两个单独的程序,预处理器和编译器处理。预处理器先运行。
您的代码实际上由两种语言组成,一种叠加在另一种上面。预处理器处理一种语言,即所有以“#”开头的指令(以及这些指令的含义)。它处理“#include”,“#define”和其他指令,并且保持代码的其余部分不变(除了预处理器指令的副作用,如宏替代等)。
然后编译器出现并处理预处理器生成的输出。它处理“C”语言,几乎忽略了预处理器指令。
您的问题的答案是“#include”是由预处理器处理的语言的一部分,并且使用该语言“;”不是必需的,实际上是“额外的令牌”。
- 1. 为什么#include指令在语句结尾处没有分号?
- 2. 为什么预处理程序指令不起作用
- 3. git指出分支之后没有合并 - 为什么?
- 4. 有没有C++预处理指令的在线手册?
- 5. Gfortran预处理器指令
- 6. C++预处理指令
- 7. C#预处理器指令
- 8. VB.NET预处理器指令
- 9. 为什么有人会使用#if 1 C预处理器指令?
- 10. Erlang:有没有相当于C预处理器##指令?
- 11. 警告与#ERROR预处理指令有撇号
- 12. 为什么HTML中没有'include'指令?
- 13. 什么是__DARWIN_C_LEVEL C预处理符号?
- 14. 预处理指令导入基于对C#中的预处理指令平台
- 15. 为什么#line指令不会在false中在#ng中处理?
- 16. 我没有收到XSL处理指令!
- 17. 这为什么执行没有分号?
- 18. 自动属性后为什么没有分号
- 19. 预处理指令内定义?
- 20. 预处理!gfortran中的DEC $指令
- 21. Unity预处理器指令错误?
- 22. Lex规则的C预处理指令
- 23. xib中的预处理器指令?
- 24. 预处理器指令:#elif未定义?
- 25. C预处理指令(SQR-的Funktion)
- 26. objective-c预处理器指令
- 27. 个人预处理器指令
- 28. 预处理器指令和#error
- 29. nuget库中的预处理器指令
- 30. Objective-C的预处理指令发出
因为没有必要 – 2010-10-02 11:30:03
只需在一个定义之后放一个,你就会明白。 – ruslik 2010-10-02 12:28:24