當包含庫c時,行不會以分號結尾,而其他語句則可以。 這背後的原因是什麼?爲什麼要包含不以分號結尾的行?
回答
相同的原因#define宏不是 - 它們是預處理器,它在編譯器正確接管之前擴展了諸如include和define之類的東西。
以#開頭的行不是C語言本身的一部分,它們是預處理器的指令。最初設計時,不需要分號。
#include
是一個預處理命令,如#define
。 #include
告訴編譯器在實際編譯代碼之前在源代碼中包含指定的文件。
我修復了您的格式;當你輸入一個答案時,你可以看看文本框下方的預覽,看看它會是什麼樣子。 #是一個格式化字符,所以你需要以某種方式保護它。 – 2009-10-25 15:56:47
感謝您的幫助。 – sdp07 2009-10-25 15:58:22
「...而其他陳述」。
首先,預處理指令不是陳述。 聲明是一個只存在於語法/語義級別的實體。在任何語法分析開始之前,預處理器指令都會在翻譯的相對較早的階段進行處理,因此在那個階段還沒有「聲明」這樣的事情。而且,由於這個原因,要求用分號結束#include
指令沒有任何意義。如果事實如此,按照定義,預處理器指令佔據整條線,這意味着它們已經由換行符終止。任何額外的終結者都是多餘的。其次,並不是所有的「其他陳述」都以分號結尾。例如,一個複合語句不是
i = 5;
{ /* <- compound statement begins here... */
i = 10;
} /* <- ... and ends here. Note: no semicolon */
i = 15;
- 1. 以只包含冒號的行結尾的shell腳本?
- 2. 在css結尾處的問號包含url是什麼?
- 3. 爲什麼java語句在以分號結尾時失敗
- 4. PHP以分號結尾
- 5. 爲什麼在.h頁面的結尾處包含#endif?
- 6. Rails:爲什麼我的路由強制以點號結尾?
- 7. 爲什麼要包含/需要多次?
- 8. Git,Nuget和行結尾。爲什麼要這麼辛苦?
- 9. 從文件中獲取不以分號結尾的行
- 10. 爲什麼#include指令在語句結尾處沒有分號?
- 11. 爲什麼整個包結構需要包含在Class.forName()中?
- 12. 爲什麼方法名以0結尾?
- 13. 爲什麼「國際貨幣符號」以空格字符結尾?
- 14. 合併所有以IF開始並以分號結尾的行
- 15. 爲什麼sed命令包含符號
- 16. 爲什麼此分句需要分號?
- 17. [0] .outerHTML - 爲什麼需要包含'[0]'?
- 18. 氣流:PythonOperator:爲什麼要包含'ds'arg?
- 19. 我需要爲Java RandomUtils包含什麼?
- 20. MERGE語句必須以分號(;)結尾
- 21. 爲什麼不爲這個DNS qname Q。以NULL字符結尾?
- 22. 爲什麼string.split()結果包含undefined?
- 23. 爲什麼如果cp不以冒號結尾,class.getClassLoader()會拋出空指針?
- 24. 爲什麼包含xml根作爲xpath的一部分我得不到結果
- 25. 爲什麼CodeIgniter不能在包含括號的SQL查詢中返回結果?
- 26. 爲什麼一些.Net異常以換行符結尾
- 27. 爲什麼在sed後回顯使其他行以^ M結尾
- 28. 執行以分號結尾的Oracle SQL查詢
- 29. 以句點或分號結尾的列表行
- 30. 匹配字符串的結尾但不包含換行符?
多一點定義 - 編譯器運行前的預處理器運行,它會替換文本。 #include語句被替換爲引用文件的內容。將一個#define輸入到查找表中,然後在代碼中看到定義時,將其替換爲存儲的值等等。實際上,您可以使用另一個預處理器而不是標準的預處理器,但很少人們在現實世界中這樣做。 – 2009-10-25 15:54:43
是不是它也是預處理器,如\的時髦線繼續的東西,並連接斷字符串文字? – JustJeff 2009-10-25 16:05:52
@JustJeff:參見http://stackoverflow.com/questions/1476892/poster-with-the-8-phases-of-translation-in-the-c-language;在預處理(階段4)和語義分析/編譯(階段7)之間的翻譯階段6中完成字符串文字連接,因此您可以自由地在預處理器或編譯器中執行;在預處理程序本身開始工作之前,在第2階段中沿着反斜線加入行。 – Christoph 2009-10-25 16:55:38