2011-06-15 99 views
7

對於我們可以在C語言中使用#IF預處理程序的表達式類型,我有點困惑。我嘗試了下面的代碼,它不工作。請解釋並提供可用於預處理器的表達式的示例。C預處理程序#if表達式

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 

int c=1; 

#if c==1 
    #define check(a) (a==1)?a:5 
    #define TABLE_SIZE 100 
#endif 

int main() 
{ 
    int a = 0, b; 
    printf("a = %d\n", a); 
    b = check(a); 
    printf("a = %d %d\n", a, TABLE_SIZE); 
    system("PAUSE"); 
    return 0; 
} 
+0

C標準或任何好書的副本是否會提供答案?例如,Google爲「N1570」找到C11標準最新草案的免費副本。 – gnasher729 2014-04-09 10:00:25

回答

20

預處理器無法在表達式中使用C程序中的變量 - 它只能對預處理器宏起作用。所以當你在預處理器中嘗試使用c時,你不會得到你所期望的。

但是,您也不會收到錯誤,因爲當預處理器試圖評估未定義爲宏的標識符時,它會將該標識符視爲值爲零。

所以,當你打這個片段:

#if c==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 

c預處理器使用無關與C程序中的變量c。預處理器會查看是否有爲c定義的宏。由於沒有,它評估以下表達式:

#if 0==1 

這當然是錯誤的。

既然你不會出現在你的程序中使用的變量c,您可以執行以下操作來獲得一致的行爲與你想要什麼:

#define C 1 

#if C==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 

(請注意,我也做了宏名大寫,符合宏名稱的約定。)

2

在完成任何編譯之前,預處理器在文本上運行。它不知道如何解析C.什麼你可能想要的,而不是int c=1;

#define C 1 

和測試工作你有它的方式:

#if C == 1 

這裏的關鍵是,這是所有定義之前編譯時間。預處理器不關心C變量,當然不關心它們的值是什麼。

請注意,約定是在ALL_CAPS中定義預處理器宏名稱。

0

預處理器不計算C變量。它在編譯之前對源代碼進行「預處理」,從而擁有自己的語言。相反,這樣做:

#define c 1 

#if c==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 
... 
0

在您的例子c是編譯器生成的符號,c沒有價值,直到運行時,而預處理程序表達式在構建時(其實評價顧名思義在編譯器處理代碼之前),因此只能對構建時存在的前處理器符號進行操作。

此外,這樣的表達式必須是編譯時間常數,或實際上更確切地說預處理時間常數,因爲編譯器常量表達式如sizeof(...)例如也未預處理期間定義。