• 宏定义和宏编译


     
    // 以下是宏定义的一些用法 
    
    11.4.2 #if defined… #else …#endif
    
    此编译指令为#ifdef … #else …#endif的等价编译指令。其语法格式如下:
    #if defined 常量表达式
    代码段1
    #else
    代码段2
    #endif
    或
    #if defined (常量表达式)
    代码段1
    #else
    代码段2
    #endif
    此编译指令的简单形式为单分支的条件编译指令,其语法形式如下:
    #if defined常量表达式
    代码段1
    #endif



    因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下: 
    
    #define .... 
    #define .... 
    ........ 
    ........ 
    #define a 100 
    ....... 
    此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子 
    #if defined a 
    #undef a 
    #define a 200 
    #endif 
    上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200 
    
    同样,检验a是否定义: 
    #ifndef a //如果a没有被定义 
    #define a 100 
    #endif 
    
    以上所用的宏中:#undef为解除定义,#ifndef是if not defined的缩写,即如果没有定义。 
    
    这就是#if defined 的唯一作用! 
    



    #include <lcm_drv.h>
    extern LCM_DRIVER nt35510_lcm_drv;
    extern LCM_DRIVER hx8369_lcm_drv;
    extern LCM_DRIVER bm8578_lcm_drv;
    extern LCM_DRIVER nt35582_mcu_lcm_drv;
    extern LCM_DRIVER hx8357b_lcm_drv;
    extern LCM_DRIVER hx8369_dsi_lcm_drv;
    extern LCM_DRIVER hx8369_hvga_lcm_drv;
    extern LCM_DRIVER ili9481_lcm_drv;
    extern LCM_DRIVER nt35582_lcm_drv;
    extern LCM_DRIVER s6d0170_lcm_drv;
    extern LCM_DRIVER spfd5461a_lcm_drv;
    extern LCM_DRIVER ta7601_lcm_drv;
    extern LCM_DRIVER tft1p3037_lcm_drv;
    extern LCM_DRIVER zte6516_lcm_drv;
    extern LCM_DRIVER r61408_lcm_drv;
    extern LCM_DRIVER lg4572b_lcm_drv;
    
    
    
    LCM_DRIVER* lcm_driver_list[] = 
    { 
    #if defined(LCM_DRIVER_CUST)
     
            &nt35510_lcm_drv,// 0
            &r61408_lcm_drv, //1
            &lg4572b_lcm_drv,// 2 
            &hx8369_lcm_drv,//3
         
    #endif 
        #if defined(NT35510)
        &nt35510_lcm_drv,
        #endif
    
        #if defined(NT35510)
        &nt35510_lcm_drv,
        #endif
        #if defined(HX8369)
        &hx8369_lcm_drv,
        #endif
    
        #if defined(BM8578)
        &bm8578_lcm_drv,
        #endif
    
        #if defined(NT35582_MCU)
        &nt35582_mcu_lcm_drv,
        #endif
    
        #if defined(HX8357B)
        &hx8357b_lcm_drv,
        #endif
    
        #if defined(HX8369_DSI)
        &hx8369_dsi_lcm_drv,
        #endif
    
        #if defined(HX8369_HVGA)
        &hx8369_hvga_lcm_drv,
        #endif
    
        #if defined(ILI9481)
        &ili9481_lcm_drv,
        #endif
    
        #if defined(NT35582)
        &nt35582_lcm_drv,
        #endif
    
        #if defined(S6D0170)
        &s6d0170_lcm_drv,
        #endif
    
        #if defined(SPFD5461A)
        &spfd5461a_lcm_drv,
        #endif
    
        #if defined(TA7601)
        &ta7601_lcm_drv,
        #endif
    
        #if defined(TFT1P3037)
        &tft1p3037_lcm_drv,
        #endif
    
        #if defined(ZTE6516)
        &zte6516_lcm_drv,
        #endif
        #if defined(HX8357B_LENOVO)
        &hx8357b_lcm_drv,
        #endif
    
        #if defined(R61408)
        &r61408_lcm_drv,
        #endif
    
        #if defined(LG4572B)
        &lg4572b_lcm_drv
        #endif
     
     
    
    };
    
    #define LCM_COMPILE_ASSERT(condition) LCM_COMPILE_ASSERT_X(condition, __LINE__)
    #define LCM_COMPILE_ASSERT_X(condition, line) LCM_COMPILE_ASSERT_XX(condition, line)
    #define LCM_COMPILE_ASSERT_XX(condition, line) char assertion_failed_at_line_##line[(condition)?1:-1]
    
    unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*);
    LCM_COMPILE_ASSERT(0 != sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*));
    

    extern LCM_DRIVER* lcm_driver_list[];
    extern unsigned int lcm_count;
    const char str[]="JBLCM#1#AAAA";  
    LCM_DRIVER *disp_drv_get_lcm_driver(const char* lcm_name)
    {
    	LCM_DRIVER *lcm = NULL;
    	printf("[LCM Auto Detect], we have %d lcm drivers built in\n", lcm_count);
    	int g_lcm_number;
    	g_lcm_number = (int)(str[6])-'0'; 
    
    #if  defined(LCM_DRIVER_CUST)
    {
    		if (g_lcm_number>-1)
    			{	 lcm = lcm_driver_list[g_lcm_number];// 0
    				lcm->set_util_funcs(&lcm_utils);
    				lcm->get_params(&s_lcm_params);
    
    				lcm_params = &s_lcm_params;
    				lcm_drv = lcm;
    				isLCMFound = TRUE;
    				
    				printf("[LCM Specified]\t[%s]\n", (lcm->name==NULL)?"unknown":lcm->name);
    
    				goto done;
    			}
    		else
    			{
    					LCM_PARAMS s_lcm_params_new = {0};
    					LCM_PARAMS *lcm_params_new = &s_lcm_params_new;
    
    					lcm = lcm_driver_list[0];
    					memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
    					lcm->get_params(lcm_params);
    					int i;
    					for(i = 1;i < lcm_count;i++)
    					{
    						memset((void*)lcm_params_new, 0, sizeof(LCM_PARAMS));
    						lcm_driver_list[i]->get_params(lcm_params_new);
    
    						if((lcm_params->width * lcm_params->height) > 
    							(lcm_params_new->width * lcm_params_new->height))
    						{
    							lcm = lcm_driver_list[i];
    							memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
    							lcm->get_params(lcm_params);
    						}
    					}
    			}
    		  
    				printf("[LCM Auto Detect] no lcm device found\n");
    				printf("[LCM Auto Detect] we will using the lcm driver with minimum resolution\n");
    
    				// if we are here, it means:
    				// 1.there is no correct driver for the lcm used;
    				// 2.there is no lcm device connected.
    				// we will find the lcm with minimum resolution to use, 
    				// in case physical memory is not enough
    				// goto done;
    }
    #else { 
    		if(lcm_count ==1)
    		{
    			// we need to verify whether the lcm is connected
    			// even there is only one lcm type defined
    			lcm = lcm_driver_list[0];
    			lcm->set_util_funcs(&lcm_utils);
    			lcm->get_params(&s_lcm_params);
    
    			lcm_params = &s_lcm_params;
    			lcm_drv = lcm;
    			isLCMFound = TRUE;
    			
    			printf("[LCM Specified]\t[%s]\n", (lcm->name==NULL)?"unknown":lcm->name);
    
    			goto done;
    		}
    	   else
    		{
    			int i;
    
    			for(i = 0;i < lcm_count;i++)
    			{
    				lcm_params = &s_lcm_params;
    				lcm = lcm_driver_list[i];
    
    				printf("[LCM Auto Detect] [%d] - [%s]\t", 
    					i, 
    					(lcm->name==NULL)?"unknown":lcm->name);
    
    				lcm->set_util_funcs(&lcm_utils);
    				memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
    				lcm->get_params(lcm_params);
    
    				disp_drv_init_ctrl_if();
    				disp_drv_set_driving_current(lcm_params);
    				disp_drv_init_io_pad(lcm_params);
    
    				if(lcm_name != NULL)
    				{
    					if(!strcmp(lcm_name,lcm->name))
    					{
    						printf("\t\t[success]\n");
    						isLCMFound = TRUE;
    						lcm_drv = lcm;
    
    						goto done;
    					}
    					else
    					{
    						printf("\t\t[fail]\n");
    					}
    				}
    				else 
    				{
    					if(lcm->compare_id != NULL && lcm->compare_id())
    					{
    						printf("\t\t[success]\n");
    						isLCMFound = TRUE;
    						lcm_drv = lcm;
    
    						goto done;
    					}
    					else
    					{
    						printf("\t\t[fail]\n");
    					}
    				}
    			}
    			
    			printf("[LCM Auto Detect] no lcm device found\n");
    			printf("[LCM Auto Detect] we will using the lcm driver with minimum resolution\n");
    
    			// if we are here, it means:
    			// 1.there is no correct driver for the lcm used;
    			// 2.there is no lcm device connected.
    			// we will find the lcm with minimum resolution to use, 
    			// in case physical memory is not enough
    			{
    				LCM_PARAMS s_lcm_params_new = {0};
    				LCM_PARAMS *lcm_params_new = &s_lcm_params_new;
    
    				lcm = lcm_driver_list[0];
    				memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
    				lcm->get_params(lcm_params);
    
    				for(i = 1;i < lcm_count;i++)
    				{
    					memset((void*)lcm_params_new, 0, sizeof(LCM_PARAMS));
    					lcm_driver_list[i]->get_params(lcm_params_new);
    
    					if((lcm_params->width * lcm_params->height) > 
    						(lcm_params_new->width * lcm_params_new->height))
    					{
    						lcm = lcm_driver_list[i];
    						memset((void*)lcm_params, 0, sizeof(LCM_PARAMS));
    						lcm->get_params(lcm_params);
    					}
    				}
    			}
    		}
    	 
    	
    }
    



  • 相关阅读:
    让你少奋斗10年的工作经验
    POJ Exponentiation解题
    数据结构树和二叉树
    语句摘录
    ACM解题报告格式
    编程规范
    数据结构图
    Java学习之二Java反射机制
    使用Python正则表达式提取搜索结果中的站点
    toj 1702 A Knight's Journey
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124275.html
Copyright © 2020-2023  润新知