C语言#include还有些你不知道的事

共 2588字,需浏览 6分钟

 ·

2021-07-13 06:31

关注、星标公众号,直达精彩内容


来源:技术让梦想更伟大

作者:李肖遥


#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文件可以自己写一个例子吗?

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧


浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报