找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3597|回复: 1
打印 上一主题 下一主题
收起左侧

51头文件REG51.H中__REG51_H__的条件编译与STM32的#if !defined条件编译

[复制链接]
跳转到指定楼层
楼主
ID:60266 发表于 2014-8-19 23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

通常的51或的头文件都会使用如下方式:
#ifndef __REG51_H__
#define __REG51_H__
//头文件内容...
#endif

这是C语言里的条件编译!
意思是,如果预编译时没有定义宏__REG51_H__,则定义该宏,然后编译其后的内容,到#endif结束。其作用是防止头文件嵌套包含时造成的重复编译。

例如,两个文件都包含了,第一次遇到#include 时,会包括处理此文件,处理的同时定义了__REG51_H__。第二次再遇到#include 的时候,因为已经定义了__REG51_H__,所以编译器不会再处理#endif之前的内容。这样就防止了重复编译。


在stm32中会遇到这样的条件编译:


#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)


#edfif


这里我们先讲讲#ifdef 和 #if defined 的区别,后者可以组成复杂的预编译条件,比如


#if defined (AAA) && defined (BBB)

xxxxxxxxx

#endif

这时候是否编译取决于AAA和BBB是否都已经被宏定义,如果二者都被宏定义则编译,只要二者中的一个没有被宏定义,这时候就不编译了。实际上就是判断if后面那句话为真还是假,在决定是否编译。

#if defined (AAA) || VERSION > 12

xxxxxxxxx

#endif



而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时

#ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if defined


而#if !defined 就是用于判断复杂的条件不成立时,则编译。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65126 发表于 2014-8-20 11:28 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表