使用STM32开发的朋友不知道是否有发现过这样的一些宏定义?如下:
#ifdefined (__CC_ARM)
#pragmaanon_unions
#endif
看到上面的语句一开始确实搞不懂为什么要写这些东西,通过上网去查询,才搞明白这其中的使用原理。
上面的代码段我们可以看到两部分的内容:
1) __CC_ARM2) #pragma anon_unions
这两个都有啥用呢?待我一一道来!
1、__CC_ARM 是 ARM 编译中的宏选项
__CC_ARM 是一个编译器的选项,在ARM开发中根据开发环境的不同,有好几个可选的宏选项。
(1)__CC_ARM 是对应 ARM RealView 开发平台的,它需结合uvision、eclipse或CodeWarrior等开发环境来使用的。
(2)__ICCARM__ 是对应 IAR EWARM 开发环境的,是 IAR Systems 公司为ARM 微处理器开发的一个集成开发环境。
(3)__GNUC__ 是对应 GNU Compiler Collection 开发平台的。GCC最初是为GNU操作系统专门编写的一款编译器,是一款开源的软件。
(4)__TASKING__ 是对应 Altinum Designer 开发平台的。Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统。
2、#pragma anon_unions 支持匿名结构体/联合体
匿名结构体/联合体指的是没有命名的结构,因为没有对应的名字,所以也不会直接创建这个对象或者变量,一般都是在嵌套结构中使用。
之所以要使用这个东西进行,是因为在gcc编译器中是支持匿名结构体/联合体的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的结构体/结合体,就需要使用 #pragma anon_unions 告知编译器,不然会编译不通过。
那到底什么样的才算是匿名结构体/联合体呢?我下面举个例子,大家一看就会明白了。
如下代码:
typedefunion{struct{uint32_tAddress;
uint32_tOutputBits;
uint32_tExtendedAddressBits;
uint32_tExtendedOutputBit;
uint32_tFrameID;
uint32_tEmptyBits;
};uint32_tValue;
} StdFrame_t;
从上面可以看出来,定义结构体或者联合体时,如果没有命名的话,那这个结构体/联合体就是匿名的。
注:#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
3、补充几个调试非常好的操作
3.1、__LINE__
__LINE__ 用以指示本行语句在源文件中的位置信息,即这条语句在源文件中的行号。
3.2、__FILE__
__FILE__ 用以指示本行语句所在源文件的文件名,即标示这条语句是在哪个源文件中出现的。
3.3、__func__
__func__ 用于指示某个语句出现在哪个函数中,即可以输出该语句所在的函数的函数名。
注意:这个关键字在windows下时使用vc6.0是不支持的。