C语言条件编译#if_#elif_#ifdef_#ifndef

        假如要开发一款产品,开始的程序一般会利用前面已开发完毕的程序,但是程序的时钟可能不是我们需要的,时钟的变化会导致串口波特率的产生偏差,这时候我们可以利用宏来选择

/************系统时钟频率定义,主要用于配置UART波特率**********/
#if (SYSCLK_SRC == IRCH)
	#define FOSC		(3686400)
#elif (SYSCLK_SRC == PLL)
	#define PLL_Multiple			6			//PLL倍频倍数
	#define FOSC		(3686400*PLL_Multiple)
#else
	#define FOSC		(3686400)
#endif

        #if、#elif、#else 和 #endif #ifndef都是预处理命令,整段代码的意思是:如果宏 SYSCLK_SRC 与IRCH相同,就保留第3 行代码,删除第 5、6、8 行代码;如果宏 SYSCLK_SRC 与 PLL相同,就保留第 5 、6 行代码;如果所有的宏都为假,就保留第 8 行代码。
        这些操作都是在预处理阶段完成的,多余的代码以及所有的宏都不会参与编译,不仅保证了代码的正确性,还减小了编译后文件的体积。
        这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能。

#if 的用法

        #if/后面接的是表达式, 这个表达式的结果必须为一个数值(任意数值皆可,但不能为空)

#if 的一般格式:

#if 整型常量表达式1
    程序段1
#elif 整型常量表达式2
    程序段2
#else
    程序段4
#endif

        意思是:如果“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,如果“表达式2”结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一点和 if else 非常类似。
        需要注意的是,#if 命令要求判断条件为“整型常量”,也就是说,表达式中不能包含变量,而且结果必须是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。

#ifdef 的用法

        #ifdef 后面接着的是宏。这个与上面的 #if 不同的是,#ifdef 不在意宏表示的条件是真是假,而在意这个宏有没有被定义:      当被定义时,条件成立;    当没有被定义时,条件则不成立。

#ifdef 的一般格式:

#ifdef  宏名
    程序段1
#else
    程序段2
#endif

或

#ifdef  宏名
    程序段
#endif

      在调试过程中,我们需要用到串口调试,但是实际运行中不需要串口,所以我们可能利用#ifdef来对不需要程序进行屏蔽。

/*************************UART功能开关宏定义********************/

#define PRINT_EN			//使用uart_printf函数打印使能

#ifdef PRINT_EN
//	#define UART0_PRINT		//如果使用UART0打印,打开此宏定义
	#define UART1_PRINT		//如果使用UART1打印,打开此宏定义
			
	#ifdef UART0_PRINT
		#define UART0_EN
	#elif defined  UART1_PRINT
		#define UART1_EN
	#endif
#endif
/*************************main.c********************/	
#ifdef UART1_EN
	Uart1_Initial(UART1_BAUTRATE);	//初始化UART1
#endif

#ifdef PRINT_EN
	uart_printf ("ADC Value = 0x%x\n",AD_Value);		//打印AD值
#endif	

        如果不需要串口调试,则将#define PRINT_EN 定义为注释,如果需要则取消注释

#ifndef 的用法

#ifndef 的一般格式:

#ifndef 宏名
    程序段1 
#else 
    程序段2 
#endif

        与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。意思是,如果当前的宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译,这与 #ifdef 的功能正好相反。

三者之间的区别

        最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是其他的。

        #ifdef 可以认为是 #if defined 的缩写。

你可能感兴趣的:(C,c语言,单片机,开发语言)