Cにおける条件コンパイル


C言語には3つの前処理方式がある:マクロ定義、ファイル含む、条件コンパイル.
今回のプロジェクトファイルは機知クラウドに対応したシリアルポート構成関数であり,マクロ定義による修正を実現し,それに接続されたシリアルポートを自動的に認識し,シリアルポート初期化関連コードを実現することを望んでいるので,この機会に条件コンパイルがどうなっているのかを理解した.多くのオープンソースコードの中で、例えばFATFS、各種RTOSの中で非常に多くの条件コンパイル内容#if、#elif、#endifなどが見られ、この方式はプログラムの移植、デバッグなどに有利である.
条件コンパイルの一般的な形式1:
#if    1
   1
#elif    2
   2
......
#else
   n
#endif

式とブロックはCの構文と一致し、以下は部分コードである.
//     GIZ_UART      wifi      
#if 	GIZ_UART == 1
#define GIZ_UART_PORT		USART1
#define GIZ_UART_NVIC		USART1_IRQn
#define GIZ_UART_PORT_RCC	RCC_APB2Periph_USART1
#warning       1 wifi    !
#elif	GIZ_UART == 2
#define GIZ_UART_PORT		USART2
#define GIZ_UART_NVIC		USART2_IRQn
#define GIZ_UART_PORT_RCC	RCC_APB1Periph_USART2
#elif	GIZ_UART == 3
#define GIZ_UART_PORT		USART3
#define GIZ_UART_NVIC		USART3_IRQn
#define GIZ_UART_PORT_RCC	RCC_APB1Periph_USART3
#elif	defined(STM32F10X_HD)||defined(STM32F10X_HD_VL)||\
		defined(STM32F10X_XL)||defined(STM32F10X_CL)		//         UART4
#ifdef	GIZ_UART == 4
#define GIZ_UART_PORT		USART4
#define GIZ_UART_PORT_RCC	RCC_APB1Periph_UART4
#elif	GIZ_UART == 5
#define GIZ_UART_PORT		USART5
#define GIZ_UART_PORT_RCC	RCC_APB1Periph_UART5
#else	//      
#error	USART      
#endif
#else	//      
#error	             
#endif

コード構築情報ウィンドウに対応する情報を印刷できるerrorとwarningを用いた.defined(マクロ1)は、マクロ1が定義されているか否かを判断することができ、定義されている場合、(defined(マクロ1))この式は1であり、逆に0である.