龙空技术网

C语言之#include用法详解

程序员月下 136

前言:

今天小伙伴们对“c语言include”大概比较注重,看官们都需要分析一些“c语言include”的相关资讯。那么小编也在网络上搜集了一些关于“c语言include””的相关知识,希望我们能喜欢,你们一起来了解一下吧!

学习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__,这样的宏名

出现的重复的几率就很低了!

标签: #c语言include