C语言中的宏undef & define

来源:互联网 发布:安卓手机主题软件 编辑:程序博客网 时间:2024/05/16 10:35

在做一个菜单的时候,想首次进入菜单的时候进入方法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;  }}   elseif(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.COMWriteData(string[i]);i++;__CUT__TIME__;//delay(100); }       WriteAddress(0x40);  // 设置显示位置为第二行的第1个字              i = 0;    while(string[i] != '\0')   //'\0'是数组结束标志{// 显示字符QUICK STUDY MCUWriteData(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并不是替换//而是空这个需要注意,难道要用转义字符,(经过查询 /,不用转义) 这里发现宏定义并不是什么都替换的

原创粉丝点击