C/C++尖括号和双引号包含头文件的区别

news2024/11/22 11:24:38

前言

头文件有两种包含方式,一种是使用尖括号<>,另外一种是通过双引号""包含,例如:

#include <iostream>
#include "add.h"

那么今天就专门来聊一聊这两种方式的区别。

1.头文件的含义不同

使用尖括号<>和双引号""包含的头问价的含义是不同的。使用尖括号<>包含的头文件是一般来说,是库文件对应的头文件,而使用双引号包含的则是我们自己的编写的头文件。

我觉得库文件相关的头文件大致可以分为三类:

第一类:C/C++标准库对应的一些一些头文件

包含标准库、STL、算法等相关的一些头文件,这些一般是编译器自带的,minGw的mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++目录下面就会有一些我常用到的头文件:iostream、string、vector等头文件。包含方式如下:

#include <iostream>
#include <string>
#include <vector>

第二类:操作系统的系统头文件

如果要需要用到一些操作系统相关的接口函数,那么就需要包含这些接口函数的所在的头文件。比如Linux系统的系统头文件位于目录/usr/include/sys中,包含time.h、epoll.h、sem.h等头文件。该目录下所有的系统头文件列举如下:

包含方式如下:

#include <sys/epoll.h>
#include <sys/sem.h>

第三类:根据需要安装的一些特定功能库对应的头文件

比如大名鼎鼎的boost库,该库是为C++标准库提供的扩展的一些C++程序库的总称。在比如,如果我们要使用mysql数据库,肯定会先本地安装mysql数据库,安装好之后,本地就会包含mysql相关库的头文件。以linux系统为例,如果安装了boost或这mysql,就会目录/usr/include/boost以及/usr/include/mysql,这两个目录下面分别存放着boost库和mysql接口库相关的头文件。包含方式如下:

#include <boost/lambda/lambda.hpp>
#include <boost/any.hpp>
#include <mysql/mysql.h>

总的来说,如果是尖括号<>包含的头文件,一般是库文件对应的头文件,这些头文件要么是编译器或者操作系统自带的,要么是我们下载后安装的,反正不需要我们自己去编写,直接使用就可以了。

如果是双引号""包含的头文件,是我们自己编写的。

2. 查找的顺序和路径不同

我们知道在编译过程中,进行预处理的时候,会替换include后面的文件,因此必须知道文件的位置。 那么编译器是怎么查找的呢? 尖括号和""两种包含方式查找顺序是不一样的。双引号形式会查找当前目录,尖括号形式则不会。以linux系统为例,具体查找顺序和路径如下:

  • 当前目录(仅双引号形式)

  • 编译时指定的头文件目录(由gcc -I参数指定)

  • 系统环境变量 CPLUS_INCLUDE_PATH(c++头文件)或 C_INCLUDE_PATH(c头文件)指定的目录

  • gcc默认目录:/usr/include;/usr/local/include;/usr/lib/gcc/x86_64-linux-gnu/5/include等(注:最后一个路径是gcc程序的库文件地址,各个用户的系统上可能不一样)

如果各目录下存在相同的文件,则先找到哪个就使用哪个,这时顺序很重要。特别注意,尖括号形式不查找当前目录。

gcc的默认目录与安装gcc时指定的–prefix有关,该值可通过 gcc -v查看,具体的目录可通过 echo | g++ -v -x c++ -E - 查看,如下:

值得注意的是,因为查找的路径不同,在包含头文件的时候需要特别注意指定头文件的路径。比如include<mysql/mysql.h>,由于mysql.h的完整路径为/usr/include/mysql/mysql.h,而gcc默认目录有/usr/include,因此在包含的时候只需要指定路径mysql/mysql.h即可。

【参考文章】

1、https://blog.csdn.net/guotianqing/article/details/104224439

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

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

相关文章

多表连接查询

语法&#xff1a; select ... from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件 一条SQL语句中内连接与外连接可以混合使用 案例&#xff1a;查询每个员工的部门名称以及薪资等级&#xff0c;要求显示员工名、部门名、薪资和薪资等级 SQL&…

核心乐理---和弦基础

和弦命名 什么是和弦 三个或三个以上的三度堆叠成为和弦 三和弦 三和弦指的是有三个音的和弦 七和弦是指七度的和弦&#xff0c;共4个音 其余的和弦与七和弦命名规则相同&#xff0c;跨越几度就是几和弦 九和弦是指跨越九度的和弦&#xff0c;共5个音十一和弦是指跨越十一…

【阶段三】Python机器学习18篇:机器学习项目实战:AdaBoost算法的核心思想、原理与数学原理举例

本篇的思维导图: AdaBoost算法的核心思想 AdaBoost算法(Adaptive Boosting)是一种有效而实用的Boosting算法,它以一种高度自适应的方式按顺序训练弱学习器。针对分类问题,AdaBoost算法根据前一次的分类效果调整数据的权重,在上一个弱学习器中分类错误的样本的权…

和Nginx相关的TCP/IP中反向代理系统解析与调优

文章目录前言反向代理系统分析消耗资源分析CPUMemory网卡压测与调优实战压测数据对比什么是TIME_WAITkeepalive开启前后数据对比小结关于后续端口不足&#xff0c;限制连接扩展协议层面无法充分做到连接的复用TCP优化分享相关文章&#xff1a;前言 本文介绍aeproxy这个应用以及…

IB地理科学什么?

IB地理科是一门很特别的科目&#xff0c;能帮助同学掌握技巧认识和了解这世界&#xff0c;而这课程分为两部分&#xff0c;包括自然环境和人文社会。IB地理科两部分 首先是自然环境&#xff0c;包括生态系统、气候&#xff0c;地壳活动等等 &#xff1b;另外是人文社会&#x…

Nosql和Redis介绍,Redis五大数据类型及操作,跳跃表

NoSQL数据库是用来解决性能问题的&#xff0c;分很多类。redis是NoSQL的一种。 NoSQL的引入&#xff1a; 随着Web2.0时代的到来。可以进行网络请求的不仅限与电脑。用户还可以通过手机端&#xff0c;平板甚至汽车等来进行网络请求。网络请求极具增加&#xff0c;增加了服务器…

【代码随想录】LC 102. 二叉树的层序遍历

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 一、题目 1、原题链接 力扣 2、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问…

linux下miniconda环境的配置以及软件的安装

miniconda 我们需要在自己的目录下安装conda环境&#xff0c;所以需要自定义安装位置 mkdir /share/nas6/wangyq/biosoft/miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /share/nas6/wangyq/biosoft/miniconda/miniconda.sh注意…

070-JAVA项目实训:仿QQ即时通讯软件系列讲座五(讲解用户注册功能)

【上一讲】069-JAVA项目实训:仿QQ即时通讯软件讲座四(讲解系统登录功能)_CSDN专家-赖老师(软件之家)的博客-CSDN博客 本文主要内容是实现注册QQ用户功能,自动获取本机IP地址,与系统用户判断端口是否唯一,使用的主要技术如下: 1.使用数据库技术完成注册功能; 2.自动…

Linux系统编程——锁

目录线程同步:锁的使用:使用matex(互斥量、互斥锁)一般步骤:restrict关键字:死锁:读写锁&#xff1a;条件变量实现生产者-消费者代码信号量实现消费者生产者线程同步: 协同步调&#xff0c;对公共区域数据按序访问。防止数据混乱&#xff0c;产生与时间有关的错误。 锁的使用…

原来这些技术标准,是字节跳动人参与制定的

我们常常遇到这类问题&#xff1a;因为不同厂商产品标准不同、接口不一致&#xff0c;导致 A 产品无法兼容 B 产品&#xff0c;C 接口和 D 接口无法连接&#xff0c;实在令人困扰。其实&#xff0c;技术从业者们一直在试图解决这些不统一、不兼容的问题&#xff0c;他们的方法是…

ceres学习笔记(一)

本来还想着先对照着官方doc来学习的。突然在csdn里面搜了下&#xff0c;发现了几篇高质量的文章&#xff0c;就先对应这几篇文章学习&#xff0c;来快速入门。 一、ceres求解问题一般步骤 使用ceres-solver求解优化问题一般分为下面三步&#xff1a; 1.第一步&#xff1a;构…

aws cdk 配置 lambda 函数的金丝雀发布

之前的文章介绍了使用sam框架完成lambda函数的金丝雀发布&#xff0c;这里使用cdk创建lambda函数项目实现此功能 Building CI/CD pipelines for lambda canary deployments using AWS CDK 项目的结构如下图所示 lambda堆栈示例 应用程序和环境配置 #!/usr/bin/env python3 im…

数据结构与算法0—大纲

数据结构&#xff1a;数据结构是计算机存储、组织数据的方式。是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组. 算法&#xff1a;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法…

Vue动态路由、动态路由如何进行参数的传递、$router和$route的区别、命名路由、命名视图

一、什么是动态路由 ​ 将URL地址中可变的内容设置成参数&#xff0c;根据不同的参数渲染不同的组件。&#xff08;组件可以复用&#xff09; 二、动态路由如何进行参数的传递 ​ 1. 如何设置URL地址中的参数&#xff1a;“/url/:参数名” ​ 2. 在组…

Linux环境下配置Nginx

文章目录安装环境配置安装Nginx需要安装第三方的开发包安装Nginx启动并访问Nginx安装完毕Linux——centos7版本 安装环境配置 Nginx是C语言编写的&#xff0c;所以需要配置C语言编译环境&#xff08;要联网&#xff09; 安装gcc环境 [roota ~]# yum install gcc-c 已加载插件…

【Unity3D编辑器扩展】Unity3D中解决Text的清晰度问题

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在程序开发中&#xff0c;常常会遇到Unity中Text文字不清晰的问…

中兴服务器迈络思NS312网卡down掉网口物理指示灯不熄灭解决方法--NS312型号ConnectX-4 Lx

中兴服务器迈络思NS312网卡down掉网口物理指示灯不熄灭解决方法–NS312型号ConnectX-4 Lx 中兴服务器做网卡倒卡测试时&#xff0c;出现如下问题&#xff1a; 中兴服务器迈络思网卡&#xff0c;卡片NS312&#xff0c;型号ConnectX-4 Lx&#xff0c;万兆网卡在执行ifdown或ip l…

SmartZone ICR/OCR Professional 7.2 NET Crack

SmartZone ICR/OCR 专业版 v7.2 采集 by Ω578867473 检测并报告字体属性、字体大小和大写字母高度。特征 检测并报告字体属性、字体大小、大写字母高度和基线详细信息&#xff0c;作为 Microsoft Windows 上单个字符识别结果的一部分。检测和报告图像方向并识别图像&#xff0…

Spring的生命周期

Spring作为当前Java最流行、最强大的轻量级框架&#xff0c;受到了程序员的热烈欢迎。准确的了解Spring Bean的生命周期是非常必要的。我们通常使用ApplicationContext作为Spring容器。这里&#xff0c;我们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也…