2009-10-25 39 views

回答

18

相同的原因#define宏不是 - 它們是預處理器,它在編譯器正確接管之前擴展了諸如include和define之類的東西。

+4

多一點定義 - 編譯器運行前的預處理器運行,它會替換文本。 #include語句被替換爲引用文件的內容。將一個#define輸入到查找表中,然後在代碼中看到定義時,將其替換爲存儲的值等等。實際上,您可以使用另一個預處理器而不是標準的預處理器,但很少人們在現實世界中這樣做。 – 2009-10-25 15:54:43

+0

是不是它也是預處理器,如\的時髦線繼續的東西,並連接斷字符串文字? – JustJeff 2009-10-25 16:05:52

+0

@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

10

以#開頭的行不是C語言本身的一部分,它們是預處理器的指令。最初設計時,不需要分號。

4

#include是一個預處理命令,如#define#include告訴編譯器在實際編譯代碼之前在源代碼中包含指定的文件。

+1

我修復了您的格式;當你輸入一個答案時,你可以看看文本框下方的預覽,看看它會是什麼樣子。 #是一個格式化字符,所以你需要以某種方式保護它。 – 2009-10-25 15:56:47

+0

感謝您的幫助。 – sdp07 2009-10-25 15:58:22

7

「...而其他陳述」。

首先,預處理指令不是陳述聲明是一個只存在於語法/語義級別的實體。在任何語法分析開始之前,預處理器指令都會在翻譯的相對較早的階段進行處理,因此在那個階段還沒有「聲明」這樣的事情。而且,由於這個原因,要求用分號結束#include指令沒有任何意義。如果事實如此,按照定義,預處理器指令佔據整條線,這意味着它們已經由換行符終止。任何額外的終結者都是多餘的。其次,並不是所有的「其他陳述」都以分號結尾。例如,一個複合語句不是

i = 5; 

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

i = 15; 
相關問題