|
学习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__,这样的宏名 出现的重复的几率就很低了!

|