概述
筆者需要完成“多個宏定義控制同一代碼分支”的功能。平時都是接觸簡單的用法,比如:
#ifndef TEST1 #define TEST1 #endif /* TEST1 或 TEST2被定義,則選擇執行printf1,否則執行printf2 */ #ifdef TEST1 printf1("....."); #else #ifdef TEST2 printf1("....."); #else print2("....."); #endif #endif /* 或者, TEST1和TEST2均未定義,則選擇執行printf1,否則執行printf2 */ #ifndef TEST1 printf1("....."); #else #ifndef TEST2 printf1("....."); #else print2("....."); #endif #endif
上述代碼則是#ifdef和#ifndef的常規用法。但是上述代碼看起來很冗余,我們更傾向使用如下方式
/* 本段代碼是:錯誤用法,錯誤用法,錯誤用法 */ #ifdef TEST1 || TEST2 printf1("....."); #else printf2("....."); #endif /* 本段代碼是:錯誤用法,錯誤用法,錯誤用法 */
但上述方法是錯誤的。因為ifdef和ifndef僅能跟一個宏定義參數,而不能使用表達式。此時可以考慮使用#if defined
和 #if !defined
高階用法
上述邏輯使用#if defined
和 #if !defined
后變為如下簡潔風格代碼
/* TEST1 或 TEST2被定義,則選擇執行printf1,否則執行printf2 */ #if defined TEST1 || defined TEST2 printf1("....."); #else printf2("....."); #endif /* TEST1 或 TEST2未被定義,則選擇執行printf1,否則執行printf2 */ #if !defined TEST1 || !defined TEST2 printf1("....."); #else printf2("....."); #endif