聊聊预编译那些事——

平时看代码总能看到写陌生的东西。它们与应用代码无关,却能帮助我们,很好的管理代码,或者按照我们预想的去编译处理。

为此,编译器就提供了这些东西。。(一下就是我遇到的不常用,又或者比较重要的用法!!)

内置的macro:

先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

ANSI C标准中有几个标准预定义宏(也是常用的):

__LINE__:在源代码中插入当前源代码行号;

__FILE__:在源文件中插入当前源文件名;

__DATE__:在源文件中插入当前的编译日期

__TIME__:在源文件中插入当前编译时间;

__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

__cplusplus:当编写C++程序时该标识符被定义。

编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

<预编译宏一>

_FILE_

它指的是,包含该宏_FILE_所在文件的文件路径名。  数据类型应该是 char const*

_FUNCTION_

它指的是,包含该宏_FUNCTION_所在的函数的——函数名。  数据类型 char const*

_LINE_

又指,包含_LINE_这行的代码,所在的行号。    数据类型 int

/*有用用法:当我们调试的时候,我想知道我的函数有没有编译。比如他被外部宏层层控制,这个时候不方便知道他有没有编译有没有执行。

我们可以这样:printf("FILE=%s,Function=%s, Line=%d",_FILE_, _FUNCTION_, _LINE_)。*/

案例: zegbee中定义 #define st(x)  do{x}while(_LINE_==-1)

  #define  SET_REGS()  st(ioreg1=0; ioreg2=0;)

  体格醒,类似宏定于多条语句,记得用大括号包好; 运算表达式,也应该小括号,包好。

。。。当然想要知道哪些代码会被编译,可以如下:

<预编译宏二>

#error  。。。。

造成编译错误,代码是不能编译通过咯! (大小写好像都行,在IAR上试过,不知其他怎么样 #ERROR 。。)

/*#error “Complie stoped here !!”*/

#warning  。。。。

让编译器发错警告信息。

/*#warning "你正在编译这段代码" */

<预编译宏三>

。。。(待续)

 

IAR编译:如何将函数编译在内存中运行

#if defined (__ICCARM__)

__ramfunc

#endif

static void funcA();//函数申明

#if defined (__ICCARM__)

__ramfunc

#endif

#if defined (__ICCARM__)

__ramfunc

#endif

static void funcA()   //函数定义

{

。。。

}

#if defined (__ICCARM__)

__ramfunc

#endif

这样代码在执行时就能搬到RAM中运行,增加速率。缺点占内存。

 

如何将数据结构按照 指定字节对其?

#pragma(1)//当前指定单字节对其

struct student{

unsigned char age;

unsigned char nane[8];

unsigned short score_sum;

}

#pragram ()

转载于:https://www.cnblogs.com/xiaowendianqiuxiang/p/5136523.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值