艺考网
全国站

轻松学习C语言预处理指令(五)include指令的用法及奇思妙想

xunaa
2024-10-06 05:44:41
编辑说
对于一个程序员来说,只要写过一句“hello world!”就可以了。 C程序中,他必须使用#include指令,因为没有#include“stdio.h”,就不可能输出“hello world!”细绳。除了在程序头

对于一个程序员来说,只要写过一句“hello world!”就可以了。 C程序中,他必须使用#include指令,因为没有#include“stdio.h”,就不可能输出“hello world!”细绳。除了在程序头中包含库函数头文件的用法之外,它其实还有很多强大的用途。今天我们将重新审视这个不起眼的预处理指令。 (如果您是有经验的程序员,可以直接跳过基础部分,为了照顾不同水平的读者,还详细介绍了基本用法。)

文件搜索机制:双引号模式

include的本意是把另一个文件包含到当前文件中。有两种模式:

#include "file1.h" #include file2.h 双引号模式分为绝对路径和相对路径两种模式。绝对路径是指按照指定的路径从根目录开始查找头文件。 “盘符:\”、“盘符:\\”、“盘符:/”表示Windows下的根目录,形式为:

#include "盘符:\路径\文件名.扩展名" #include "盘符:\\路径\文件名.扩展名" #include "盘符:/路径/文件名.扩展名" 在linux环境下,可以只有正斜杠/,没有盘符的概念。在Windows环境下,这三者是等效的用法。

相对路径是指从源文件所在的当前路径开始查找头文件。 “。”是当前目录,“.”是当前目录的父目录。最好只使用正斜杠“/”来连接目录和目录,或者目录和文件,虽然也可以使用反斜杠,但是最好保持Windows和Linux风格的一致性,因为在实际开发中,相对路径几乎都是总是用来搜索头文件,这很好用绝对路径。优点很明显,就是灵活性高,可以随意移动源文件目录,而无需改变头文件的搜索机制。示例如下:

#include “./file.ext” #include “file.ext” #include “./sub_path/file.ext” #include “sub_path/file.ext” #include “./file.ext” #include “./brother_path/file.ext"#include "././uncle_path/file.ext" “.”代表源文件所在的当前目录,“file.ext”代表文件,两者分别是表示当前目录中的文件。请注意,许多教程甚至高级程序员都说“./”指的是当前目录,这是一个严重的错误!

第一种和第二种方法是等价的,第二种方法只是第一种方法的简化编写方式。第三种和第四种用法是等效的,都表示当前目录的“子目录”中的文件。第四种用法也省略了当前目录的写入。第五种表示要使用的头文件在父目录中,第六种表示在兄弟目录(父目录的其他子目录)中,第七种表示该文件在“叔叔”目录中。目录”。

文件搜索机制:尖括号模式

一般情况下,如果包含程序员定义的头文件,则必须使用双引号模式的搜索机制,并且最好使用相对目录模式。但如果是C语言标准库函数头文件,使用尖括号模式会更方便。只需将要包含的文件名直接放在尖括号内即可。例如:

#include stdio.h #include stdlib.h #includestdarg.h 尖括号本身代表一个特定的目录,因此不需要像双引号模式那样显式指定头文件路径。在Windows系统中,如果安装了不同的C语言IDE开发环境,标准库函数的头文件路径会不同。在同一个开发环境中,不同的库函数所在的目录也可能不同,当然也可以相同。

例如,在Visual Studio 2022中,以我的个人电脑为例,stdlio.h和stdlib.h都安装在:

C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt

stdarg.h 头文件安装在:

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include

在我个人电脑安装的CLION2023环境中,stdlio.h和stdlib.h安装在:

C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\x86_64-w64-mingw32\include

stdarg.h 头文件安装在:

C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\lib\gcc\x86_64-w64-mingw32\13.1.0\include

我们不需要关心系统提供的标准头文件的具体路径,直接用尖括号访问即可。当然,这些头文件的目录可以修改到新的位置,但必须在相应的IDE中设置,而不是简单地删除。我要反复强调的是,千万不能轻易这样做。

头文件查找机制的进阶思考

1)

轻松学习C语言预处理指令(五)include指令的用法及奇思妙想

双引号模式:预处理器会首先在指定路径中搜索头文件。如果找不到,它会在编译器自己的路径(存储在IDE或操作系统的环境变量中)中搜索。

尖括号:预处理只会在编译器的默认目录中查找。

2)

程序员定义的头文件也可以使用尖括号模式访问,例如#include myheader.h。有两种方法。例如可以直接放在编译器的默认目录下,如include目录下,也可以放在其他目录下,如stdio.h所在目录下。您还可以在IDE 中设置新的路径环境变量。

与上述情况类似,也可以通过双引号方式访问标准库函数,如#include "stdio.h"。我强烈不推荐这两种反转或混合的方法。

否则,尖括号和双引号可以让代码阅读器一眼就能区分出哪些是自定义头文件,哪些是标准头文件。如果它们混合在一起,会让维护者感到困惑,并且不是一个好的编程实践。

包含防护机制

头文件的包含保护机制非常重要。我在介绍预处理指令#pragma Once和条件编译指令的用法时提到过。

include的本质:到底什么是“文件包含”

include化简数组

#include 指令必须占据自己的行

使用#include 包含文件时,必须单独占据一行,即#include 语句当前行前后必须有空格。因为预处理器会从当前行的下一行开始插入包含文件的全部内容,并且前后不会有空格,所以会出现错误。

include调试程序

有时我们需要调试多个代码块。一般情况下,条件编译指令是用来控制哪个代码块生效的,但是如果使用include就非常方便而且省事,比如:

int main(){.//函数1: //#include "func1.txt" //函数2: //#include "func2.txt".当我们需要调试代码块1时,只需删除#include“func1.txt”前面的注释即可。如果您不挑剔,请注释掉。如果您正在调试,请删除注释。这是非常方便和间接的。否则,您必须提及编译说明,或使用注释。成块地掉下来。我的例子很简单,并没有体现include的作用。在这种简单的场景下,注释就更方便了。在复杂的情况下,include的便利性就会体现出来。

还有一个更重要的用法。有时我们需要在一个项目中包含多个源文件。每个源文件都有一个主要函数。因为main函数对应的是具有一定功能的程序,所以编译肯定不会通过。

我们常规的简单做法是,将一个main函数的源文件分离到一个单独的项目中,或者使用cmake来控制同时只能启用一个main函数。这个用法在我的另一篇文章中也有详细介绍。

今天介绍另一个比较巧妙的方法,因为cmake是微软Visual Studio IDE的一个弱点,功能支持比较差。使用起来不像CLION那么方便,但有时需要使用VS,因为编译器的调试能力非常好。所以我经常这样做:创建一个源文件:

#include "main01.h" #include "main02.h" #include "main03.h". 每个主文件中都有一个main函数。如果需要调试,请取消注释。如果不想调试,直接注释掉即可。它非常简单易用。我把我的截图贴出来如下:

此屏幕截图是我的项目文件夹的组织结构。源.c 文件用作控制要编译的头文件的开关。每个.h文件对应一个要调试的小函数。下图2是源文件的内容:

下图是待调试的功能之一。这是文件B.h.其实把后缀改成.c就可以了,主要是为了避免和源文件混淆。 B.h的内容如下。注意右上角的红色箭头,说明是B.H文件:

用户评论

浮世繁华

看标题就激动了,终于有人来聊聊c语言里面这神秘的<code>#include</code> 指令!

    有6位网友表示赞同!

北染陌人

我之前一直不知道这个<code>#include</code>指令能做这么多事情!

    有5位网友表示赞同!

爱情的过失

分享一下我用过<code>#include </code> 解决问题的经验,太厉害了

    有9位网友表示赞同!

孤单*无名指

想看一些<code>include</code>指令的奇思妙想,我的代码偶尔会用到一些 unconventional 的用法。

    有8位网友表示赞同!

情字何解ヘ

学习C语言一定要搞懂预处理指令!

    有15位网友表示赞同!

揉乱头发

直接告诉我们<code>#include </code>怎么用就行,不要废话太多!

    有7位网友表示赞同!

怀念·最初

期待看到一些关于文件包含的妙招,比如头文件重用等!

    有15位网友表示赞同!

别伤我i

<code>#include </code> 是C语言基础之基础,一定要好好掌握!

    有13位网友表示赞同!

赋流云

感觉这个标题很有吸引力,我准备过来看看。

    有6位网友表示赞同!

万象皆为过客

预处理指令太复杂了,希望能看到一些简单的例子

    有11位网友表示赞同!

野兽之美

我一直以为<code>#include </code>的用法很简单,看了标题感觉可以学到新知识!

    有8位网友表示赞同!

有些人,只适合好奇~

c语言里面头文件包含真是个神奇的东西!不知道还有哪些奇特的用法?

    有19位网友表示赞同!

孤自凉丶

期待作者分享一些用<code>#include </code>解决问题的案例,学习一下!

    有17位网友表示赞同!

此刻不是了i

这篇文章一定要深入浅出地讲解,让新手也能看懂!

    有16位网友表示赞同!

最怕挣扎

我喜欢这种包含一些创意的预处理指令示例,可以激发灵感!

    有13位网友表示赞同!

迷路的男人

终于有人讲<code>#include </code>!太棒了!

    有13位网友表示赞同!

千城暮雪

给我来一篇文章,从C标准库的头文件入手讲解<code>#include </code>用法吧!

    有8位网友表示赞同!

熏染

快来分享一些`include`指令的奇思妙想啊!

    有5位网友表示赞同!

免责声明
本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除!

大家都在看

轻松学习C语言预处理指令(五)include指令的用法及奇思妙想

轻松学习C语言预处理指令(五)include指令的用法及奇思妙想

对于一个程序员来说,只要写过一句“hello world!”就可以了。 C程序中,他必须使用#include指令,因为没有#include“stdio.h”,就不可能输出“hello world!”细绳。除了在程序头
2024-10-06
PHP你真的了解INCLUDE和REQUIRE吗?

PHP你真的了解INCLUDE和REQUIRE吗?

1.注意,这两个是语言结构,而不是方法。类似于echo、print、isset()、empty()、unset()等,它们是语言结构,而不是函数! 2. include 和require 都将外部文件引入到当前上下文中,但
2024-10-06
PHP中include和require的区别详解

PHP中include和require的区别详解

include() 的使用方式与require 相同: include('myfile.php')语句一般放在流程控制的处理部分。 include 在使用时被加载。 require 是在开始时加载的。 _once后缀表示已
2024-10-06
C语言中include的使用方法

C语言中include的使用方法

#include的使用方法有两种,如下: #include stdHeader.h #include 'myHeader.h' 使用尖括号和双引号''的区别在于头文件的搜索路径不同: 尖括号:编译器会在系统路径中搜索头文
2024-10-06
C++ 和C++ 之间的各种差异包括

C++ 和C++ 之间的各种差异包括

1.#include #include 指的是编译器的类库路径中的头文件。 如果你的编译器定义的内置头文件是在C:\Keil\c51\INC\下引用的,那么#includestdio.h引用的是头文件C:\Keil\c51\I
2024-10-06
中学英语同义词分析180讲包括、排除

中学英语同义词分析180讲包括、排除

1. 包括及物动词。它的意思是“包含、包含、列出、包含在内”。它的意思是“包括……(即在整体之内)”。例如: 价格包括房屋和家具。 该名单包括许多新名字。 我把鸡蛋列入了
2024-10-06
如果≠ 在这种情况下

如果≠ 在这种情况下

参加测试 下雨了,你最好带上雨伞。 A、以防万一 B、在这种情况下 知识点分析 • in the case of 大家看到in the case of.这句话都觉得很容易理解。case的意思是“实
2024-10-06
微软品牌电脑配件获得“重生”:Incase将推出“微软设计”系列产品

微软品牌电脑配件获得“重生”:Incase将推出“微软设计”系列产品

据官方介绍,微软原创的Sculpt人体工学键盘、Modern鼠标、无线桌面键鼠套装“850”以及时尚网络摄像头等畅销产品将以“Designed by Microsoft”的名义以Incase品牌销售。该
2024-10-06
Incase确认2024Q4推出Designed by Microsoft系列周边产品

Incase确认2024Q4推出Designed by Microsoft系列周边产品

据IT House 2023 年4 月报道,微软当时表示,将不再销售微软品牌下的鼠标、键盘、摄像头等外围产品,而是专注于Surface 品牌的电脑配件。 Incase母公司Onward Brands今年1月
2024-10-06
万一有什么用

万一有什么用

外面很冷,你最好穿上外套以防万一。 外面很冷,你最好穿上外套,以防万一。 更仔细地检查你的论文以防万一。 再次仔细检查试纸,以防万一。 (2)用作连词引导条件状语从句和目的状
2024-10-06