C语言中的宏undef & define

在做一个菜单的时候,想首次进入菜单的时候进入方法1不是首次进入的时候进入方法2,由于他们之间有公共的一部分 当时用的方法是 利用#define FIRST 然后第一次用完后undef 后面判断FIRST有没定义 ,#ifdef FIRST。。。但在测试的时候却发现运行不尽人意,第二天偶尔看见一篇关于宏定义的解说,才发现 自己从写代码的初期就错了,(语法错误 ) 宏的定义 在 预处理的时候进行处理,记得很清楚,用却想当然。 


void init_matrix(unsigned char temprat_inter,unsigned char temprat_float, 
 unsigned char menu_flag, unsigned char key_argv)
 {	
     if(menu_flag % 10 == 0){ //清屏幕 
	 	Write_com(0x01);//清显示:清屏幕指令
 	 	switch( menu_flag) {
		case FIRST_INTO	:menu_flag = HOME_PAGE;
		case HOME_PAGE:{
	    				   string[0] = '0' + temprat_inter/10; 
  						   string[1] = '0' + temprat_inter%10 ;
  						   string[2] = '.';
			               string[3] = '0' + temprat_float%10;//前4位显示
 						   menu_flag != TEMPRAT_EXCEED ? strcpy(&string[7],"safe") : strcpy(&string[7],"Warning") ;
						   
						   strcpy(string1,"MenuSet");

		}break;//对温度进行显示	显示主页


		case MENU_DISPLAY:{	//菜单展示
						   memset(string,0 ,sizeof(string)); 
						   memset(string1,0,sizeof(string1)); //将 数组清空,为下面的菜单切换 做准备
						   strcpy(string,"    PhoneSet ");
						   strcpy(string1,"  TemperatSet");

						   #define MENU_SET_INIT_SUCESS

		
		}break;

		case TEMPRAT_SET_MENU:{
		
		}break;

		case PHONE_SET_MENU:	{
		
		}break;

	   default: break;

	  }
	}
   else	if(menu_flag %10 == SECOND_INTO)	{ //第二次进入根据 菜单页面 选择刷新部分  温度下降的很慢 ?什么原因???根据 键值 移动光标
//else{
		switch((menu_flag - 1 )){
			case HOME_PAGE:{
				  WriteAddress(0x00);//写如数据的首地址	
				  WriteData('0' + temprat_inter/10);
				  WriteData('0' + temprat_inter%10);
				  WriteData('.');
				  WriteData('0' + temprat_inter%10);
				  	
					}break;
			case MENU_DISPLAY: {
					  /*消去初始化光标的 影响 我们把宏注销掉*/
				   #ifdef MENU_SET_INIT_SUCESS
				   #undef MENU_SET_INIT_SUCESS
				   #endif 
					//if(key_argv == NULL)
			       if(key_argv == ADD)FIRST_LINE; //只是光标的移动即可
				   if(key_argv == DEC)SECOND_LINE;//向下则光标移动到下面  
				  WriteData('k' + temprat_inter/10);
			}break;
			case TEMPRAT_SET_MENU:
			case PHONE_SET_MENU:  break;
			default : WriteAddress(0x00);//写如数据的首地址	 
			WriteData('k' + temprat_inter/10);
		
			
		}
	
	}

 }
 void __1602lcd_main( unsigned char temprat_inter,unsigned char temprat_float,
  unsigned char menu_flag, unsigned char key_argv)     //主函数	   不敢用指针,只敢用原型
 {
  unsigned char i,j;
   i = 0;
  
  	//while(num [i]!= 'd' ){		//这个不可以
  	//	string[i] = num[i];
	//	i++;
  	//}
  
	  // string[1]='s'; //这个可以


	       init_matrix(temprat_inter,temprat_float,menu_flag,key_argv);  	  
	  if(menu_flag == FIRST_INTO){ 
  			LcdInt();         //调用LCD初始化函数
  			delay(10);
  //while(1)
     		//{
           	
			 Write_com(0x01);//清显示:清屏幕指令
		}

		if(menu_flag%10 == FIRST)  //首次进入
		{		 	__CUT__TIME__;delay(5); 
		 			WriteAddress(0x00);  // 设置显示位置为第一行的第1个字
				    __CUT__TIME__;	delay(5);
	  	     		i = 0;
		  while(string[i] != '\0')    //'\0'是数组结束标志 
			 {						// 显示字符	WWW.RICHMCU.COM
					WriteData(string[i]);
					i++;
					__CUT__TIME__;//delay(100);
			 }

			       WriteAddress(0x40);  // 设置显示位置为第二行的第1个字
	  	            i = 0;
		    		while(string[i] != '\0')   //'\0'是数组结束标志
					{						// 显示字符	QUICK STUDY MCU
						WriteData(string1[i]);
						i++;
						__CUT__TIME__;//delay(100);
					}  

		}

		//if(menu_flag%10 == SECOND_INTO){
		//	WriteAddress(0x00); WriteData('4');	WriteData('5');
		//}	自己调的时候用

		//while(1);
		//delay(1000);	
			//while(1);
        //	delay(1000);

		//	Write_com(0x08);  //关闭显示 
			//while(1);
				
        //	delay(3000);	   //延时  维持显示一段时间

		//	Write_com(0x0c);//开显示 
		
	//	while(1);
        //		delay(3000);	   //延时  维持显示一段时间


		//	Write_com(0x0f);	//开光标
			  // while(1);
       	//		delay(1000);	   //延时  维持显示一段时间

		
			 //while(1);
	     //	Write_com(0x40);       //设定CGRAM地址
		//	delay(5);
		//	for(j=0;j<8;j++ )
		//	{
		//		WriteData(User[j]);//写入自定义图形 ℃ 
		//	}
	   	//	WriteAddress(0x05);//设定屏幕上的显示位置
		//	 delay(5);
	   	//	WriteData(0x00);	  //从CGRAM里取出自定义图形显示
		//while(1);	 
		//}

		#ifdef MENU_SET_INIT_SUCESS

		  		 FIRST_LINE;

		#endif
		  
		
}



#include <stdio.h>


#define NUM_1 2
#define total (NUM_1) + 4


int main()
{
int apple = 1,pear = 3;
if(apple == pear)
{
apple = 5;
#define NUM_1 3

}
printf("%d\n",(int)total);
#undef NUM_1
    #define NUM_1 1
   printf("%d\n",(int)total);
  return 0;
}


这里答案是

7

5

这个预处理不受if的语句判断。所以上面if是没用的。

今天想用 宏__COVER 当成注释符号用 即是 用这个替换  //  这个后来发现不可行  比如:#define __COVER //   这时__COVER并不是替换//而是空这个需要注意,难道要用转义字符,(经过查询 /,不用转义) 这里发现宏定义并不是什么都替换的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值