2010-10-02 91 views
2

如果我寫爲什麼在預處理指令之後沒有分號?

#include <stdio.h>; 

有沒有錯誤,但在編譯時警告出來

pari.c:1:18:警告:在#include指令的末尾額外的令牌

是什麼原因 ?

+1

因爲沒有必要 – 2010-10-02 11:30:03

+0

只需在一個定義之後放一個,你就會明白。 – ruslik 2010-10-02 12:28:24

回答

4

原因是預處理程序指令不使用分號。這是因爲他們使用換行符來分隔語句。這意味着,你不能有每行多個指令:

#define ABC#define DEF // illegal 

但是你可以通過結束每一行(除了最後一個),用\有一個在多行(或/,我忘了)。

2

因爲它們是不必要的。預處理器指令只存在於一行中,除非您明確使用了行續字符(例如對於一個大宏)。

3

因爲預處理器指令是包含在程序代碼中的行,它們不是程序語句,而是預處理程序的指令。

這些預處理指令只在單行代碼中擴展。只要找到換行符,預處理器指令就會結束。這就是爲什麼預處理器指令末尾沒有分號(;)的原因。

3

預處理器指令與C語言不同,語法也更簡單,因爲最初在C編譯器看到文件之前,它們被「解析」,如果可以調用它,則由另一個名爲cpp的程序進行調用。人們可以使用它來預處理甚至非C文件,以包括配置文件等的條件部分。

有一個名爲「unifdef」的Linux程序,如果您知道它們永遠不會是真的,您仍然可以使用它來刪除程序的某些條件部分。例如,如果您有一些代碼支持包含#ifdef ANSI/#else/#end#ifndef ANSI/#end的非ANSI標準編譯器,並且您知道不再需要支持非ANSI,則可以通過運行unifdef -DANSI來消除死代碼。

1

如果你使用#define MACRO(para) fun(para);可能是錯誤的,在它後面放一個半分符。

if (cond) 
    MACRO (par1); 
else 
    MACRO (par2); 

導致了語法錯誤

1

在編譯期間,您的代碼是由兩個單獨的程序,預處理器和編譯器處理。預處理器先運行。

您的代碼實際上由兩種語言組成,一種疊加在另一種上面。預處理器處理一種語言,即所有以「#」開頭的指令(以及這些指令的含義)。它處理「#include」,「#define」和其他指令,並且保持代碼的其餘部分不變(除了預處理器指令的副作用,如宏替代等)。

然後編譯器出現並處理預處理器生成的輸出。它處理「C」語言,幾乎忽略了預處理器指令。

您的問題的答案是「#include」是由預處理器處理的語言的一部分,並且使用該語言「;」不是必需的,實際上是「額外的令牌」。