嵌入式C中的条件编译总结

       在程序设计时,可以根据条件编译告诉编译器的条件执行或者忽略代码。例如在配置从机(eg: 模拟前端)的寄存器时,需要确认数据写入是否成功,进行读出和重写!此时可选择性的选择是否重写和重写次数。如下:

SendDataToAddr(ADDR_AFE_BIM1,Body_FWR_50KHz);
#if(DEBUG_CS1258_REWRITE == 1)
	uint8 count = REREAD_REWRITE_NUM;
	while(count != 0){
		if(ReadAddrData(ADDR_AFE_BIM1) != Body_FWR_50KHz){
			myPrintf(MY_PRINTF_ERROR,"%s(%d):SendDataToAddr error;\r\n",__func__,__LINE__);
			DelayTimeMs(10);
			SendDataToAddr(ADDR_AFE_BIM1,Body_FWR_50KHz);
		}
		else{
			break;
		}
		count--;
	}
	if(count == 0){
		myPrintf(MY_PRINTF_ERROR,"%s(%d):count == 0;\r\n",__func__,__LINE__);
	}
#endif

条件编译规则如下:

#ifdef   MAVIS       //如果定义了MAVIS,则执行下面的条件
    {
        ;
    }
#else                //如果未定义了MAVIS,则执行下面的条件  //#else 可省略
    {
        ;
    }
#endif

// 备注: C只编译符合条件的模块;

// 例如:

#ifdef CUSTOMIZED
    // thread 0
    {
        "Dsp1-thread0",     // thread name
        Alg_init,      // init function
        Alg_prep,      // pre-process function
        Alg_proc,      // main process function
        Alg_deinit,    // de-init function
        TRUE,               // need output buffer?
    },

#endif
    // thread 1, 
    {
       "",//Dsp1-thread1",      // thread name
        NULL,               // init function
        NULL,               // pre-process function
        NULL,               // main process function
        NULL,               // de-init function
        FALSE,              // need output buffer
    }

      再例如:在定义头文件时,为了避免重复定义使用#ifndef  #endif来定义。

#ifndef  __USER_CS1258_H__ 
#define  __USER_CS1258_H__

#define	U8	unsigned char        // 关键字重定义
#define U16	unsigned short
#define U32	unsigned int

#include "esp8266.h"             // 库文件包含

#define EVENT_DISABLE_CS1258_TEST		0        // 明示常量

typedef struct CS1258Event_s{    // 结构体定义
  char	event;	//事件
  int	dat; //数据
}CS1258Event_t;

void userCs1258Init(void);       // 函数原型声明

#endif
/*
备注:
 1) 一个功能中,包含一个.C文件和一个.h文件。在.h文件中最好将用#ifndef #endif将 关键字重定义,库文件包含,宏参数定义,结构体定义,函数声明等包含进去。这样,头文件可以避免被多次包含。头文件中定义的变量不存在重复声明或定义。
 2)__USER_CS1258_H__ :下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯。需要大写是因为其实质是一个宏名,宏名需要大写,其次下划线是为了容易区分,避免命名重复;注:标准保留使用下划线作为前缀, 所以在自己的代码中不要这样写, 避免与标准头文件中的宏发生冲突。 
 3)C语言一般支持8层以上的文件包含;
 4)当预处理器首次发现该文件被包含时,__USER_CS1258_H__ 是未定义的, 所以定义了__USER_CS1258_H__ , 并接着处理该文件的其他部分。 当预处理器第2次发现该文件被包含时, __USER_CS1258_H__ 是已定义的,所以预处理器跳过了该文件的其他部分。
*/

     再例如,运用#if  #elif  #elif #else #endif 来进行条件编译

#if defined (IBMPC)    //可以用 #if defined(VAX) 代替 #ifndef VAX 和#elif 一起使用;
    #include "ibmpc.h"
#elif defined (VAX)
    #include "vax.h"
#elif defined (MAC)
    #include "mac.h"
#else
    #include "general.h"
#endif

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值