C语言#include还有些你不知道的事
关注、星标公众号,直达精彩内容
来源:技术让梦想更伟大
作者:李肖遥
#include简介
在C语言中#include是preprocessor的一条指令,告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。
#include "xxx.h" 和 #include<xxx.h>
有两种方式可以指定插入头文件:
#include <filename>
#include "filename"
如果需要包含标准库头文件比如一些数学函数的原型等等,应该使用<>
,如果需要包含自己程序所开发的源文件,应该使用""
。
这两种形式的#include行为是预处理器指定好的都是复制其他文件中的内容,区别在于搜索header文件时,二者的搜索路径不同,按照指定路径顺序搜索。
#include“xxx.h”搜索的路径覆盖了#include<xxx.h>搜索的路径,但使用<>
文件的路径是在标准include路径(关于这几个路径的搜索就不多说了),所以使用<>
的效率更高。
在 #include 命令中使用宏
#include 命令也是可以使用宏的,例如
#ifdef _DEBUG_
#define MY_HEADER "blinky.h"
#else
#define MY_HEADER "blinkyQP.h"
#endif
#include MY_HEADER
这样在我们调试的时候可以根据_DEBUG_
是否定义来确定包含哪些头文件,当然你都包含也可以,但是会有重复包含的问题,后面会说到。
嵌套的 #include 命令
通过#include命令插入的源文件本身也可以包含另一个 #include 命令,预处理器最多允许15层的嵌套包含,但这种现象会发生相同的一个文件被多次包含的情况,例如
//blinky.h
#include <stdio.h>
...
如果blinky.c文件如下所示,就会直接与间接的两次包含stdio.h。
//blinky.c
#include <stdio.h>
#include "blinky.h"
...
那么如何避免多次包含呢,我们可以采用常用的条件式编译的命令,例如
#ifndef BLINKY_H_
#define BLINKY_H_
/* ...实际的头文件blinky.h的内容写在这里... */
#endif /* BLINKY_H_ */
在创建一个头文件时,可以用#define指令为它定义一个唯一的标识符BLINKY_H_。通过#ifndef指令检查这个标识符BLINKY_H_是否已被定义,如果已被定义,则说明该头文件已经被包含了,就不要再次包含该头文件;反之,则定义这个标识符名称,以避免以后再次包含该头文件。
打印文本内容比较长
#include<stdio.h>
int main(void)
{
printf
#include"tech.txt"//tech.txt的内容为("ID:TechDreamer");
return 0;
}
//输出ID:TechDreamer
在预编译的时候,将#include文件的内容嵌入到当前所在位置,当文本内容比较长,直接复制在源代码里面会显得代码冗余不美观,可以使用这种方法,等价于
#include<stdio.h>
int main(void)
{
printf("ID:TechDreamer");
return 0;
}
不能把#include 指令放置在extern "C" { ... }里面
这里可以参考为什么不能把#include 指令放置在 extern "C" { ... } 里面?
C语言中#include只能包含.h文件吗?
C语言中#include可以include .c
这样使用吗?是不是没见过,其实这样是可以的。
从语法角度讲,include的意思就是从当前位置包含另外一个文件,从这点讲,include .c文件是可行的,c编译器完全能够正常处理。
那怎么样包含.c文件呢?因为本文主要是讲#include的用法有哪些,这个就暂时不说啦,感兴趣的可以去了解一下。
但是为什么不常见include .c文件?我们需要了解.c与.h文件功能的区别。一般来说.h文件提供接口,.c文件提供具体的实现,不一定要一一对应。如果一个.c文作包含其他模块对应的.h文件,而这个.c文件可能有一些结构,变量等与包含其他模块的实现(.c文件)重复了,会导致出错,所以一般不会使用,毕竟我们不写奇葩的代码。
提问
#Include 搜索的路径有哪些?
extern "C"有什么作用呢?
include .c文件可以自己写一个例子吗?