1. 程式人生 > >巨集定義和巨集編譯

巨集定義和巨集編譯

 
// 以下是巨集定義的一些用法 


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);
					}
				}
			}
		}
	 
	
}