2012-08-08 92 views

回答

6

逗號是一個會阻止代碼編譯的錯誤:我會認爲這是一個錯字。

考慮:

#define EQ(a, b) ((a) == (b)) 

定義一個宏等於運算符==

使用這個宏的代碼後,你可以輸入,例如:

if (EQ(2+2, 4)) 

代替:

if (2+2 == 4) 

不是很有用,真的。

6

這意味着什麼:這個代碼是不合格的。緊跟在#define之後的令牌必須是標識符,而,則不是。

如果要刪除,,則會定義一個名稱爲EQfunction-like macro,它帶有兩個參數。

+0

是啊,我意識到,我的錯字...... – ryantata 2012-08-10 08:06:51

1

讓我們一步一步來

#define MAX 10 

這將通過10在你的代碼文件替換單詞「MAX」的每一個實例。這非常像定義一個具有一個主要區別的常量變量。 #define語句的解釋在編譯之前完成。這有助於示例將MAX用作數組大小。如果你使用了一個變量,那麼在很多情況下會導致編譯器錯誤。

您可以在Linux終端中使用cpp <filename.c>命令來查看宏執行時會發生什麼。

爲例驗證碼:

#define MAX 10 
int numbers[MAX]; 

預處理後(即預處理宏的解釋)

int numbers[10]; 

注意#define語句將消失一次解釋。

這把我們帶到另一個例子

#define square(x) (x * x) 

在我們的代碼square(x)每個實例,不僅將(x * x)所取代,而且x的值將被替換。其中有類似功能的減速效果,但是這又是不同的

所以

square(5)(5 * 5)

最後,我們的例子

#define, EQ(a, b) ((a) == (b)) 

這將取代EQ(a, b)每一個實例來代替((a) == (b))

舉個例子

EQ(4, 5)((4) == (5))

現在更換什麼是 「==」 是什麼意思?如果4和5相等,則「檢查是否相等」整個表達式將評估爲1(這顯然不是真實的),因此該表達式最終將被評估爲0.

其中或多或少像效果這個功能

int EQ(int a, int b) 
{ 
    return (a == b); 
} 

這可能是也寫成

int EQ(int a, int b) 
{ 
    if (a ==b) return 1; 
    if (a !=b) return 0; 
} 

注意,與宏我們避免了二次變量的聲明並沒有函數調用真的,這是一般的曲icker。如果您的處理器速度較慢(或微處理器),則這一優勢顯而易見。

最後讓我狀態明顯

#define simple_macro 5 
int some_integer_variable = 10; 
. 
. 
. 
some_integer_variable = simple_macro; 
simple_macro = 12; /* illegal statement */ 
simple_macro++;  /* illegal statement */ 

因爲運行預處理後,這將是

int some_integer_variable = 10; 
. 
. 
. 
some_integer_variable = 5; 
5 = 12; 
5 ++; 

哦!可能我說得太多,但讓我離開你這個(明顯)代碼

#define MAX 10 
int variable = MAX; /*this is a MAX variable */ 
char some_string[] = "the MAX value"; /* no replacement will happen here */ 
int variable_MAX;      /* no replacement will happen here */ 

運行的預編譯後會

int variable = 10; 
char some_string[] = "the MAX value"; 
int variable_MAX; 
+0

你'#定義方(x)(x * x)'例子是避免宏的一個很好的理由。 'square(4 + 2)'的結果是什麼? 36或14?並且,通過優化,像double square(double d){return d * d; }'可以內聯,因此不會比宏的更慢(但更安全)。 – stefaanv 2012-08-08 09:09:35

+0

在這種情況下,您可能需要使用大量的括號:-)。我個人不喜歡宏。功能更易於保持閱讀和理解,並且不易出錯。對於大多數具有當今處理能力以及編譯器成熟度的應用程序,我認爲在許多情況下代碼質量方面的成本高於優化代碼的成本。 – 2012-08-08 09:43:37

相關問題