回答
原因是預處理程序指令不使用分號。這是因爲他們使用換行符來分隔語句。這意味着,你不能有每行多個指令:
#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