C语言中#include<...>和#include“...“的区别

news2024/9/28 1:19:57

C语言文章更新目录

C语言学习资源汇总,史上最全面总结,没有之一
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本操作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
动图图解C语言选择排序算法,含代码分析
动图图解C语言插入排序算法,含代码分析
C语言指针数组和数组指针详解
5分钟搞懂C语言中的传值和传址
C语言——动态数组的创建和使用

C语言实例专栏(持续更新中…)

正文

在实际写代码过程中,关于引入头文件会看到有以下两种方式:

  • #include<...>
  • #include"..."

那么这两种方式有什么不同呢?

带着这个问题,先来看下面的例子:

在磁盘目录下创建文件test.h和test.c,这里使用的目录是D:\cyyzwsq,如下图

文件里分别编辑以下代码

  • test.h
//
// Created by 冲哥 on 2023/02/23.
// 微信公众号:C语言中文社区
// 个人站点:www.cyyzwsq.cn
//
#include <stdio.h>

int add(int a, int b){
    return a + b;
}
  • test.c
//
// Created by 冲哥 on 2023/02/23.
// 微信公众号:C语言中文社区
// 个人站点:www.cyyzwsq.cn
//
#include "test.h"

int main() {
    int a = 10;
    int b = 20;
    int c = 0;
    c = add(a, b);
    printf("c:%d\n",c);
    return 0;
}

在当前目录下打开cmd,在命令行使用gcc -v test.c命令查看程序的编译过程,
这里使用的gcc版本信息如下:

gcc version 12.2.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)

使用该命令前先确保自己的电脑上已经装有MinGW,并且已经配置好了环境变量。否则执行命令时会报错。

执行命令后命令行会输出一堆信息,向下翻看,会发现以下信息:

#include "..." search starts here:
#include <...> search starts here:
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include-fixed
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/include
End of search list.

从上面的信息可以看出:

#include "..." search starts here后没有列举目录,说明编译器对于#include "..."方式引入的头文件是从当前目录开始找的,若未找到该头文件,再到预定义的默认路径下进行寻找。

#include <...> search starts here后列举了三个路径(我的mingw64在D:/SOFTWARE/路径下),说明编译器对于#include <...>方式引入的头文件是从指定的这三个路径找的,这三个目录其实就是预定义的默认路径,编译器提供的库文件都在这三个路径下。可以通过给gcc指定-I参数来添加搜索路径。

 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include-fixed
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/include

例如执行命令gcc -v -I D:/cyyzwsq/aaa test.c,命令行会输出一下信息

#include "..." search starts here:
#include <...> search starts here:
 D:/cyyzwsq/aaa
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include-fixed
 D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/include
End of search list.

搜索路径列表里多了D:/cyyzwsq/aaa路径。

这里要注意的是,#include <...>方式引入的头文件只会从指定的搜索路径下查找,找不到就会直接报错,不会再到当前目录查找。

这里使用实例验证一下,在test.c文件开头加一行代码#include "aaa.h"

  • test.c
//
// Created by 冲哥 on 2023/02/23.
// 微信公众号:C语言中文社区
// 个人站点:www.cyyzwsq.cn
//
#include "test.h"
#include "aaa.h"

int main() {
    int a = 10;
    int b = 20;
    int c = 0;
    c = add(a, b);
    printf("c:%d\n",c);
    return 0;
}

在当前目录下打开cmd,在命令行使用gcc -v test.c命令查看程序的编译过程,由于当前路径和默认路径下都没有aaa.h文件,所以编译时报错。

接下来在D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include路径下创建一个aaa.h文件,再编译一下,编译通过。

将上面代码里的#include "aaa.h"改成#include <aaa.h>

  • test.c
//
// Created by 冲哥 on 2023/02/23.
// 微信公众号:C语言中文社区
// 个人站点:www.cyyzwsq.cn
//
#include "test.h"
#include <aaa.h>

int main() {
    int a = 10;
    int b = 20;
    int c = 0;
    c = add(a, b);
    printf("c:%d\n");
    return 0;
}

再将D:/SOFTWARE/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/include路径下把刚创建的aaa.h文件剪切到D:\cyyzwsq路径下,继续编译,由于默认路径下没有aaa.h文件,所以编译时直接报错,即使当前路径下有aaa.h文件。

总结:

#include <...>方式引入的头文件是到指定预定义的默认路径下进行寻找,如果找不到就直接报错,不会再到当前路径下查找。

#include "..."方式引入的头文件是从当前路径开始找的,若未找到该头文件,再到预定义的默认路径下进行寻找,如果还找不到就会报错。

对于系统头文件,使用这两种方式都可以。但是对于自定义的头文件,只能使用#include "..."方式

因此,在编写代码时,如果是引入自定义的头文件,建议使用#include "..."格式,引入系统头文件使用#include <...>方式

不同的编译器可能有所差别,这里只是对Windows下的gcc进行了分析。

如果您觉得本篇文章对您有帮助,请点赞,转发给更多的人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出C++ ——哈希的应用

文章目录一、位图1. 位图的概念2. STL中的位图3. 位图的特点4. 位图的应用5. 位图的实现6. 位图的使用二、布隆过滤器1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的设计思路4. 布隆过滤器的插入5. 布隆过滤器的查找6. 布隆过滤器删除7. 布隆过滤器的优缺点8. 布隆过滤器的…

div增加鼠标点透,css设置点击穿透

需求&#xff1a;将一张照片盖到一个div上面&#xff0c;但同时下面div上面的点击事件不受影响。 这样就需要用到 CSS 的鼠标穿透属性&#xff1a;pointer-events: none&#xff0c;下面主要对pointer-events属性的值做一个简单的介绍。 pointer-event的所有属性值: pointer…

计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量

政策背景 近日&#xff0c;工业和信息化部、国家发展改革委、生态环境部三部门联合印发《工业领域碳达峰实施方案》&#xff08;以下简称“方案”&#xff09;。《方案》提出&#xff0c;促进中小企业绿色低碳发展。优化中小企业资源配置和生产模式&#xff0c;探索开展绿色低…

在字节跳动,造赛博古籍

“你在字节跳动哪个业务&#xff1f;”“古籍数字化。把《论语》《左传》《道德经》这些古籍变成电子版&#xff0c;让大家都能免费看。”没错&#xff0c;除了你熟悉的那些 App&#xff0c;字节跳动还在做一些小众而特别的事情&#xff0c;古籍数字化就是其中之一。在字节跳动…

Python+Selenium4元素交互1_web自动化(5)

目录 0. 上节回顾 1. 内置的等待条件 2. 元素属性 1. Python对象属性 2. HTML元素属性 3. 元素的交互 1. 输入框 2. 按钮 3. 单选框和复选框 0. 上节回顾 DEBUG的方式&#xff1a;JS断点 Python断点编程语言提供的等待方式&#xff1a;sleepselenium提供的等待方式&…

CDGA|浅谈“以治促用,以用促治”的数据治理战略

数据治理夯实企业数字化转型基础。采取“以治促用&#xff0c;以用促治”的数据治理战略&#xff0c;可以充分释放了企业核心运行要素的活力。 “以治促用”是指通过建立在数据治理链路及用户多维评估系统的基础上&#xff0c;对数据资产重新进行价值识别&#xff0c;推进高价值…

30岁测试开发年薪不足50万,被面试官嘲讽混得太差?

近日&#xff0c;有网友发帖称&#xff1a;“30岁去应聘测试开发&#xff0c;拿不到七八十万的年薪确实有点丢人了&#xff0c;还被面试官diss混得太差了”&#xff0c;网友们看完都炸了。 来看看网友们都是怎么说的。 有网友说&#xff1a; 扯淡 有网友气到&#xff1a; 那拿…

接口自动化

为了实现真正意义上的接口自动化&#xff0c;一般使用yaml文件存储测试用例&#xff0c;代码调用里面的数据来发送请求 Controller RequestMapping("/send") public class Login {ResponseBodyRequestMapping("/login")public State login(String name,Str…

ES6-ES11基本全部语法

在进入es6语法之前&#xff0c;先走一波es5遍历迭代Api&#xff0c;&#xff0c;它们的作用&#xff0c;应用场景&#xff0c;参数&#xff0c;以及返回值分别是什么。&#xff08;forEach、map、some、every、filter&#xff09;我们统一设定一个初始数组&#xff1a;let arra…

Prophet 处理时间序列数据

Prophet 处理时间序列数据 flyfish 论文地址 https://peerj.com/preprints/3190/ 官网 https://facebook.github.io/prophet/ 源码地址 https://github.com/facebook/prophet hon import pandas as pd from prophet import Prophet df pd.read_csv(https://raw.githubuse…

2月23号作业

题目&#xff1a;题目一&#xff1a;通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输…

[HarekazeCTF2019]Easy Notes

知识点&#xff1a;session 反序列化&#xff0c;代码审计代码分析 flag.php 中有个 is_admin 函数的判断。 在 lib.php 中有 is_admin 函数&#xff0c;需要 session[admin] 为 true&#xff0c;或者通过文件读取的方式。 在 index.php 中的 include 并不能使用伪协议读取 …

JVM回顾与Java虚拟机的内存管理

目录 什么是JVM&#xff1f; 主流虚拟机 JVM与操作系统关系 JVM、JRE、JDK的关系 Java程序的执行过程 JVM翻译字节码有三种执行方式 Java虚拟机的内存管理 JVM整体架构图 JVM运行时内存 Java7和Java8内存结构的不同主要体现在方法区的实现 对于Java8&#xff0c;HotSp…

Hadoop MapReduce基本概念与详细流程

Hadoop MapReduce是Hadoop 中一个批量计算的框架&#xff0c;在整个mapreduce作业的过程中&#xff0c;包括从数据的输入&#xff0c;数据的处理&#xff0c;数据的数据输入这些部分&#xff0c;而其中数据的处理部分就要map&#xff0c;reduce&#xff0c;combiner等操作组成。…

刚接手的APP项目需要优化,需要从哪些方向入手?

对于每个Android 开发团队来说产品上线&#xff0c;是让人喜忧参半的一件事。**喜指的是&#xff1a;付出了大量的时间&#xff0c;产品终于上线了&#xff1b;而忧指的是&#xff1a;担心中间会不会出现一些性能相关的问题&#xff0c;比如卡顿、内存泄漏、崩溃……等&#xf…

干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)

大趋势&#xff1a;全链路异步化&#xff0c;性能提升10倍 随着业务的发展&#xff0c;微服务应用的流量越来越大&#xff0c;使用到的资源也越来越多。 在微服务架构下&#xff0c;大量的应用都是 SpringCloud 分布式架构&#xff0c;这种架构总体上是全链路同步模式。 全链…

java 抽象类 详解

目录 一、抽象类概述&#xff1a; 二、抽象方法 : 1.概述 : 2.应用 : 3.特点 : 三、抽象类特点 : 1.关于abstract关键字 : 2.抽象类不能被实例化&#xff0c;只能创建其子类对象 : 3.抽象类子类的两个选择 &#xff1a; 四、抽象类的成员 : 1.成员变量 : 2.成员方…

趣味三角——第12章——tanx

第12章节 tanx In his very numerous memoires, and especially in his great work, Introductio in analysin infinitorum (1748), Euler displayed the most wonderful skill in obtaining a rich harvest of results of great interest. . . . Hardly any other work …

业务单据堆积如山?如何提升会计做账效率?

某集团以“创建现代能源体系、提高人民生活品质”为使命&#xff0c;形成了贯通下游分销、中游贸易储运、上游生产的清洁能源产业链和涵盖健康、文化、旅游、置业的生命健康产品链。目前&#xff0c;某集团在全国21个省&#xff0c;为超过2681万个家庭用户、21万家企业提供能源…

Android:同步屏障的简单理解和使用

同步屏障的简单理解和使用1、背景2、何为同步屏障&#xff1f;2.1、 发送屏障消息——postSyncBarrier2.2、发送异步消息2.3、处理消息2.4、移除屏障消息——removeSyncBarrier2、系统什么时候添加同步屏障&#xff1f;参考1、背景 这里我们假设一个场景&#xff1a;我们向主线…