学习Linux C,必须要理解include,只要弄清以下几个问题,就能完全理解include了!
1.#include 实质是什么?
预编译的时候copy include头文件的内容到当前行
(疑问:预编译命令 $gcc -E test.c -o test.i)
2.#include “” 与<> 有何区别?如何验证你的结论?
“”先在当前目录查找有无该头文件,有则包含该目录下的头文件,没有则到系统指定的目录下找该头文件
<>直接到系统指定的目录下查找该文件
(疑问:系统制定的默认目录为/user/include/,我们常使用的printf函数是在/user/include/stdio.h的文件中声明的)
验证结论:分别在当前目录和系统指定的目录下定义同名的头文件,但内容不一致,预编译后,看包含了哪个目录下的头文件
在gcc编译的时候,也可以通过-I 指定头文件所在的目录,若在指定的目录找不到,则回到默认的目录下查找
3.被#include的header file中最常见的内容分为哪几类?
宏定义
typedef
包含别的头文件
inline函数定义
函数声明
struct,union,enum类型定义
(其实可以打开一个.h文件来看看,如 /user/include/stdio.h)
4.如何防止重复#include?(更确切的表述为“重复#include时如何防止重复定义/声明?”)需要说出2种方案,并说明各自的优缺点?
方案一:#pragma once 优点:不会出现宏名重复 缺点:某些老的编译器不支持
方案二:#ifndef XXX
#define XXX
#endif 优点:所以的编译器都支持 缺点:出现宏名重复
一般我们看到大多都是选择方案二,我们只要避免宏名重复就行了
宏名规则(大写,文件名作为宏名主体,以两个下划线开头以下划线结束),例如ov8830.h,宏名为__OV8830_H__,这样的宏名
出现的重复的几率就很低了!

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至89291810@qq.com举报,一经查实,本站将立刻删除。
