回答
逗號是一個會阻止代碼編譯的錯誤:我會認爲這是一個錯字。
考慮:
#define EQ(a, b) ((a) == (b))
定義一個宏等於運算符==
。
使用這個宏的代碼後,你可以輸入,例如:
if (EQ(2+2, 4))
代替:
if (2+2 == 4)
不是很有用,真的。
這意味着什麼:這個代碼是不合格的。緊跟在#define
之後的令牌必須是標識符,而,
則不是。
如果要刪除,
,則會定義一個名稱爲EQ
的function-like macro,它帶有兩個參數。
讓我們一步一步來
#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;
你'#定義方(x)(x * x)'例子是避免宏的一個很好的理由。 'square(4 + 2)'的結果是什麼? 36或14?並且,通過優化,像double square(double d){return d * d; }'可以內聯,因此不會比宏的更慢(但更安全)。 – stefaanv 2012-08-08 09:09:35
在這種情況下,您可能需要使用大量的括號:-)。我個人不喜歡宏。功能更易於保持閱讀和理解,並且不易出錯。對於大多數具有當今處理能力以及編譯器成熟度的應用程序,我認爲在許多情況下代碼質量方面的成本高於優化代碼的成本。 – 2012-08-08 09:43:37
- 1. `size * = b - a`是什麼意思?
- 2. 數據( - >)a b是什麼意思?
- 3. `a> b`是什麼意思?
- 4. 操作c = a +++ b是什麼意思?
- 5. a >> = b是什麼意思?
- 6. `a + = b + = c`是什麼意思?
- 7. 「特質A <:B」是什麼意思?
- 8. format(a,str(b))是什麼意思?
- 9. b = a-> b是什麼意思在一類列表中?
- 10. 什麼是A&B代表.Aggregate((a,b)=>聲明w/a&b)
- 11. 這是什麼意思在Javascript中:a = a | b
- 12. 逗號代表的意思是:a,b = b,a?
- 13. a + = b和a = + b之間的區別是什麼,a ++和++ a?
- 14. a,b = b,a + b和a = b,b = a + b在fibonacci中的區別是什麼[Python]
- 15. A == B對B == A,有什麼區別
- 16. 輸入(a + b)** 2,輸出a * a + a * b + b * a + b * b
- 17. scala - 什麼地圖[(A,B)]是什麼意思?
- 18. a = a + b和a + = b之間的區別是什麼?
- 19. 「a = a || []」是什麼意思?
- 20. 爲什麼a.compareTo(b)等於compareTo(a,b)或a.method(b)= method(a,b)?
- 21. 爲什麼is_(a,b)函數比python 2.7.3中的eq(a,b)更快?
- 22. Python a,b = b,a + b
- 23. Coq:如何證明「a = b - > nat_compare a b = Eq。」?
- 24. Neon指令,vsub_f32(a,b),是a-b還是b-a?
- 25. 從{a-b,b-c,c-a}改變爲{(a,b),(b,c),(c,a)}?
- 26. 混合兩個矢量:[a a]和[b b] to [a b a b]
- 27. 在matlab中,a =(b == c)是什麼意思?
- 28. Ruby中的語法[* a..b]是什麼意思?
- 29. ($ a,$ b,$ c)= @array在Perl中是什麼意思?
- 30. 在Python中,dict.pop(a,b)是什麼意思?
是啊,我意識到,我的錯字...... – ryantata 2012-08-10 08:06:51