條件編譯的用法
[cpp]view plaincopy
- #ifndef__USART_H
- #define__USART_H
- #include
- #include"stdio.h"
- externu8USART_RX_BUF[64];//接收緩沖,最大63個字節(jié).末字節(jié)為換行符
- externu8USART_RX_STA;//接收狀態(tài)標記
- //如果想串口中斷接收,請不要注釋以下宏定義
- //#defineEN_USART1_RX//使能串口1接收
- voiduart_init(u32pclk2,u32bound);
- #endif
這段程序里#define EN_USART1_RX被注釋掉了。
usart.c里有一段串口中斷響應子函數(shù)程序如下:
[cpp]view plaincopy
- #ifdefEN_USART1_RX//如果使能了接收
- u8USART_RX_BUF[64];//接收緩沖,最大64個字節(jié).
- u8USART_RX_STA=0;//接收狀態(tài)標記
- voidUSART1_IRQHandler(void)
- {
- ......
- }
- #endif
手冊給出的解釋是,這里用了宏定義#ifdef,當需要使用串口接收的時候,只要在usart.h里面定義EN_USART1_RX就可以了。不使用的時候注釋掉就可,這樣可以省出部分sram和flash。
下轉(zhuǎn)一篇文章:http://blog.163.com/solylee@126/blog/static/171823157201011914824753/
C中#if 0 和#if 1
當注釋掉大塊代碼時,使用"#if 0"比使用"/**/"要好,因為用"/**/"做大段的注釋要防止被注釋掉的代碼中有嵌套的"/**/",這會導致注釋掉的代碼區(qū)域不是你想要的范圍, 當被注釋掉的代碼很大時容易出現(xiàn)這種情況,特別是過一段時間后又修改該處代碼時更是如此。
在這里順便對條件編譯(#ifdef, #else, #endif, #if等)進行說明。以下分3種情況: 1. 情況1: #ifdef _XXXX ...程序段1... #else ...程序段2... #endif 這表明如果標識符_XXXX已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯?! ±? #define NUM ............. ............. ............. #ifdef NUM printf("之前NUM有過定義啦!:) "); #else printf("之前NUM沒有過定義!:( "); #endif } 如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當然執(zhí)行第一個printf。否則第二個printf將被執(zhí)行?! ∥艺J為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能?! ?:情況2: #ifndef _XXXX ...程序段1... #else ...程序段2... #endif 這里使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了標識符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)。例子就不舉了?! ?:情況3: #if 常量 ...程序段1... #else ...程序段2... #endif 這里表示,如果常量為真(非0,隨便什么數(shù)字,只要不是0),就執(zhí)行程序段1,否則執(zhí)行程序段2。如果有#if需要頂格寫
評論