參加華為的面試,竟然才發現#if 和#ifdef是有區別的,絕得無地自容。趕緊整理一下
先看個例子:
#define TARGET_LITTLE_ENDINA 1
#define TARGET_BIG_ENDINA 0
#ifdef TARGET_LITTLE_ENDINA
call little endina function
#else
call big endina function
#endif
不管把TARGET_LITTLE_ENDINA和TARGET_BIG_ENDINA定義成0或者1,甚至後面不寫這個0或者1
,調用的都是little endina函數,這段代碼是有問題的,就是沒有理解#if和#ifdef之間的區別。
#if的使用說明
#if的後面接的是運算式,如果運算式為1,則編譯#if下面的代碼
#if (MAX==10)||(MAX==20) code...#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那麼編譯器就會把其中的#if 與 #endif之間的代碼編譯進去(注意:是編譯進去,不是執行!!)
#ifdef的使用
#if後面接的是一個宏
#ifdef (x) ...code...#endif
這個#ifdef 它不管裡面的“x”的邏輯是“真”還是“假”,它只管這個程式前面的宏定義裡面有沒有定義“x”這個宏(即在這裡#define
x 1和#define x 0等效,都等同於#define x),如果定義了x這個宏,那麼編譯器會編譯中間的…code…否則直接忽視中間的…code…代碼。
#if defined的使用
#if defined() 的使用和#ifdef的用法一致
#if !defined()又和 #ifndef
的用法一致。
最後強調兩點:
第一:這幾個宏定義只是決定代碼塊是否被編譯!
第二:別忘了#endif
明白了之間的區別問題就變得非常的容易,修改上述代碼只要把其中的#ifdef改成#if就可以達到目的。