- 8
- 0
- 约 5页
- 2016-12-10 发布于重庆
- 举报
第?21?章?预处理
3.?条件预处理指示
我们在第?2.2?节 “头文件”中见过Header Guard的用法:
#ifndef HEADER_FILENAME
#define HEADER_FILENAME
/* body of header */
#endif
条件预处理指示也常用于源代码的配置管理,例如:
#if MACHINE == 68000int x;
#elif MACHINE == 8086long x;
#else /* all others */#error UNKNOWN TARGET MACHINE
#endif
假设这段程序是为多种平台编写的,在68000平台上需要定义x为int型,在8086平台上需要定义x为long型,对其它平台暂不提供支持,就可以用条件预处理指示来写。如果在预处理这段代码之前,MACHINE被定义为68000,则包含intx;这段代码;否则如果MACHINE被定义为8086,则包含long x;这段代码;否则(MACHINE没有定义,或者定义为其它值),包含#error UNKNOWN TARGET MACHINE这段代码,编译器遇到这个预处理指示就报错退出,错误信息就是UNKNOWN TARGET MACHINE。
如果要为8086平台编译这段代码,有几种可选的办法:
1、手动编辑代码,在前面添一行#define MACHINE 8086。这样做的缺点是难以管理,如果这个项目中有很多源文件都需要定义MACHINE,每次要为8086平台编译就得把这些定义全部改成8086,每次要为68000平台编译就得把这些定义全部改成68000。
2、在所有需要配置的源文件开头包含一个头文件,在头文件中定义#define MACHINE 8086,这样只需要改一个头文件就可以影响所有包含它的源文件。通常这个头文件由配置工具生成,比如在Linux内核源代码的目录下运行make menuconfig命令可以出来一个配置菜单,在其中配置的选项会自动转换成头文件include/linux/autoconf.h中的宏定义。
举一个具体的例子,在内核配置菜单中用回车键和方向键进入Device Drivers --- Network device support,然后用空格键选中Network device support(菜单项左边的[ ]括号内会出现一个*号),然后保存退出,会生成一个名为.config的隐藏文件,其内容类似于:
...
#
# Network device support
#
CONFIG_NETDEVICES=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
...
然后运行make命令编译内核,这时根据.config文件生成头文件include/linux/autoconf.h,其内容类似于:
...
/*
* Network device support
*/
#define CONFIG_NETDEVICES 1
#undef CONFIG_DUMMY
#undef CONFIG_BONDING
#undef CONFIG_EQUALIZER
#undef CONFIG_TUN
...
上面的代码用#undef确保取消一些宏的定义,如果先前没有定义过CONFIG_DUMMY,用#undef CONFIG_DUMMY取消它的定义没有任何作用,也不算错。
include/linux/autoconf.h被另一个头文件include/linux/config.h所包含,通常内核代码包含后一个头文件,例如net/core/sock.c:
...
#include linux/config.h
...
int sock_setsockopt(struct socket *sock, int level, int optname,char __user *optval, int optlen)
{
...
#ifdef CONFIG_NETDEVICEScase SO_BINDTODEVICE:{...}
#endif
...
再比如drivers/isdn/i4l/isdn_common.c:
...
#include linux/config.h
...
static int
isdn_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
{
...
#ifdef CONFIG_NETDEVICEScase IIOCNETGPN:
您可能关注的文档
- IE操作分析.ppt
- IE流程分析与改善20130301(阅读).ppt
- IE浏览器网页部分图片无法显示PNG图片无法显示的有效解决办法.doc
- IE现场改善培训(阅读).ppt
- ie缓慢原因以及解决方法.doc
- IE进阶学习第六章生产效率分析.doc
- IFix培训教程95584.ppt
- iFIX结构.ppt
- iframe自适应高度代码教程大全.doc
- Iforgiveyou.ppt
- 2025-2026学年天津市和平区高三(上)期末数学试卷(含解析).pdf
- 2025-2026学年云南省楚雄州高三(上)期末数学试卷(含答案).pdf
- 2025-2026学年甘肃省天水市张家川实验中学高三(上)期末数学试卷(含答案).docx
- 2025-2026学年福建省厦门市松柏中学高二(上)期末数学试卷(含答案).docx
- 2025-2026学年广西钦州市高一(上)期末物理试卷(含答案).docx
- 2025-2026学年河北省邯郸市临漳县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省石家庄二十三中七年级(上)期末历史试卷(含答案).docx
- 2025-2026学年海南省五指山市九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省唐山市玉田县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省邢台市市区九年级(上)期末化学试卷(含答案).docx
最近下载
- 高等学校中医临床教学基地教学工作水平评估指标体系与标准.pdf
- 2022届高考物理一轮复习图像经典100题.pdf VIP
- 新能源汽车电气技术 配套课件.pptx
- 2025年高考语文备考之300个文言实词汇编(含课内句子).pdf VIP
- DB11∕T2293-2024住宅工程质量品质提升技术标准.pdf VIP
- Marantz马兰士家庭影院 AV 擴音機 SR8012 SR8012 Quick Start Guide English说明书用户手册.pdf
- 人教八上:专题六 无刻度直尺作图(含解析).docx VIP
- 2023年江西省中考语文试卷及答案解析.pdf VIP
- 2025年山东劳动职业技术学院高职单招笔试语文试题库含答案解析(5套共100道单选合辑).docx VIP
- 2025-2026学年七年级英语春季开学第一课 课件:马踏新春,趣学英语(全国通用版).pptx
原创力文档

文档评论(0)