【C/C++】#include<xxx.h>和#include“xxx.h“

news2024/9/28 9:21:24

2023年7月29日,周六晚上

今天下午和晚上花了不少时间去研究这个C/C++的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别,收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。

说实话,我挺想逃避写这样的博客的,因为内容很多很复杂,想表达清楚非常困难。但是只有克服困难,才能让一篇博客产生良好的社会效益。

如果有写得不对或不够好的地方,还请指出我的错误。

写了几个小时后,终于完成大部分内容了,以后有空可能会更新。

之后,我可能会结合C++11的开源项目ceceal的官方示例程序的头文件来继续拓展这篇文章。


目录

  • #include和#include"xxx.h"之间的区别
  • 搜索的路径不同
  • 引用头文件的四种方式
  • 系统头文件目录和系统库文件目录在哪里
  • Linux环境
  • Windows环境(以gcc为例)


#include<xxx.h>和#include"xxx.h"之间的区别

搜索的路径不同

#include<xxx.h>只会到系统头文件目录中寻找。

#include"xxx.h"没带路径且只有一个头文件的名字时,比如#include"myHeader.h",那么会先在写有这句代码的源文件的当前目录中查找,没找到的话,就去系统头文件目录中查找;如果带有路径的话,比如#include"C:\myFolder\myHeader.h",就会先按照指定的路径去查找,没找到的话,就去系统头文件目录中查找。

总而言之,#include"xxx.h"的搜索范围覆盖#include<xxx.h>的搜索范围,而且#include"xxx.h"的搜索范围比#include<xxx.h>的搜索范围要大。

所以类似#include<stdio.h>的语句都可以写成#include"stdio.h",但是不建议那么做,因为会无意义地多搜索一些地方,从而产生一定的时间浪费。


引用头文件的四种方式

  • #include<带路径的头文件>,比如Linux中的#include<sys/time.h>
  • #include<头文件>,比如标准C语言的#include<stdio.h>
  • #include"带路径的头文件",比如#include"myFolder/myHeader.h"
  • #include"头文件",比如#include"myHeader.h"

系统头文件目录和系统库文件目录在哪里

Linux环境

在Linux中,系统头文件目录一般在/usr/include中,系统库文件目录一般在/usr/include

Windows环境(以gcc为例)

可以通过在命令行运行 gcc -v 命令,来查看 gcc 当前使用的系统头文件目录和系统库文件目录。

建议把命令输出的内容复制到记事本来看,这样会清晰很多。

 把命令行的内容复制到记事本,这样看得更清楚

接下来,我会拿出上面的有关内容来分析

CFLAGS='-O2 -pipe -fno-ident 
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include 
-I/c/mingw810/prerequisites/x86_64-zlib-static/include 
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' 

CXXFLAGS='-O2 -pipe -fno-ident 
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include 
-I/c/mingw810/prerequisites/x86_64-zlib-static/include 
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' 

CPPFLAGS=' 
-I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include 
-I/c/mingw810/prerequisites/x86_64-zlib-static/include 
-I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' 

LDFLAGS='-pipe -fno-ident 
-L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib 
-L/c/mingw810/prerequisites/x86_64-zlib-static/lib 
-L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '

-L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib 
-L/c/mingw810/prerequisites/x86_64-zlib-static/lib 
-L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '

 -I表示要搜索的头文件路径,-L表示要搜索的库文件路径。

CFLAGS表示C编译器的编译选项,CXXFLAGS表示C++编译器的编译选项,

CPPFLAGS表示C预处理器的选项,LDFLAGS表示链接器的选项。

这些内容这么多,我怎么看出gcc的系统头文件目录和系统库文件目录在哪里呢????

很简单,你只需要看这5段中的第一个-I或第一个-L后面的内容就可以了,

并且去掉其中的mingw810/x86_64-810-posix-seh-rt_v6-rev0,

因为这部分内容和路径无关,是一些系统信息:

  • mingw810:是指MinGW编译器的版本号,810意为gcc8.1.0。MinGW是一个用于Windows环境的开源软件开发工具集,它提供了一套GNU工具,包括编译器、链接器等。
  • x86_64:使用的是64位架构(x86-64)。
  • posix-seh:使用了POSIX风格的异常处理(SEH)。
  • rt_v6-rev0:使用的运行时(runtime)库的版本号。

通过gcc --version命令,可以验证上面的信息

 

按照上面所说的去做,这5段内容最后剩下的信息只有下面这些了(为了便于理解,我保留了CFLAGS、CXXFLAGS、CPPFLAGS、LDFLAGS)

 

//gcc编译C源文件时,在C:/mingw64/opt/include中搜索头文件
CFLAGS='-I/c/mingw64/opt/include ' 

//gcc编译C++源文件时,在C:/mingw64/opt/include中搜索头文件
CXXFLAGS='-I/c/mingw64/opt/include ' 

CPPFLAGS='-I/c/mingw64/opt/include ' 

LDFLAGS='-L/c/mingw64/opt/lib  '

//gcc编译源文件时,在C:/mingw64/opt/lib中搜索库文件
-L/c/mingw64/opt/lib'

现在来验证一下这些路径是否存在


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

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

相关文章

使用WGCLOUD监测安卓(Android)设备的运行状态

WGCLOUD是一款开源运维监控软件&#xff0c;除了能监控各种服务器、主机、进程应用、端口、接口、docker容器、日志、数据等资源 WGCLOUD还可以监测安卓设备&#xff0c;比如安卓手机、安卓设备等 我们只要下载对应的安卓客户端&#xff0c;部署运行即可&#xff0c;如下是下…

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…

x86架构ubuntu22用docker部署zsnes

0. 环境 x86 ubuntu22 1. 安装docker $ sudo apt remove docker docker-engine docker $ sudo apt update $ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg …

HiveSQL SparkSQL中常用知识点记录

目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…

leetcode 面试题 01.03. URL化

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;面试题 01.03. URL化 思路&#xff1a; 计算出空格的个数&#xff0c;我们可以知道最后一个字符的位置 endPos&#xff0c;再从后 end 向前遍历若不是空格正常拷贝&#xff0c;是空格则替换成 %20&#xff0c;最终当空格…

Linux系统编程之进程控制(上)

一、进程标识 1.pid 每个进程都有非负整数表示的唯一进程ID&#xff0c;即pid&#xff0c;其类型为pid_t类型。可用ps命令查看当前所有进程的信息&#xff0c;该命令可以加选项&#xff0c;一般使用ps -ef或ps axf(打印进程树)&#xff0c;查看当前系统所有进程的信息。需要注…

【Rust教程 | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编程语言&#xff0c;专注于速度…

【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀用repVgg抽取向量构建Faiss索引进行相似性搜索项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库&#xff0c;针对高维空间中的海量数据&#xff0c;提供了高效且可靠的检索方法。 暴力检索耗时巨大&#xff0c;对于…

Flowable-任务-用户任务

定义 顾名思义&#xff0c;用户任务是需要人工参与处理的。当流程执行到用户任务节点时&#xff0c;流程引擎会给指指定的用户&#xff08;办理人或候选人&#xff09;或一组用户&#xff08;候选组&#xff09;创建待处理的任务项&#xff0c;等待用户的处理。 用户任务的参与…

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…

AddForce

ForceMode&#xff1a; Force&#xff1a;关注的是力整体 Impulse&#xff1a;关注的是冲量&#xff0c;与质量相关 VelocityChange&#xff1a;关注的是速度&#xff0c;与质量无关 Acceleration&#xff1a;关注的是加速度&#xff0c;与质量无关 public void AddForce…

前后端分离实现博客系统

文章目录 博客系统前言1. 前端1.1 登陆页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面 2. 后端2.1 项目部署2.1.1 创建maven项目2.1.2 引入依赖2.1.3 创建目录结构2.1.4 部署程序 2.2 逻辑设计2.2.1 数据库设计2.2.2 实体类设计2.2.3 Dao层设计2.2.3.1 BlogDao 2.2.4 D…

Intel RealSense D455(D400系列) Linux-ROS 安装配置(亲测可用)

硬件&#xff1a;Intel RealSense D455 系统&#xff1a;Ubuntu 18.04 Part_1: 安装librealsense SDK2.0 1.1 注册密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE或者 sudo apt-key adv --keyserver hkp:/…

Mysql定时删除表数据

由于用户环境有张日志表每天程序都在狂插数据&#xff0c;导致不到一个月时间&#xff0c;这张日志表就高达200多万条记录&#xff0c;但是日志刷新较快&#xff0c;里面很多日志没什么作用&#xff0c;就写了个定时器&#xff0c;定期删除这张表的数据。 首先查看mysql是否开启…

【Linux】进程间通信——system V共享内存 | 消息队列 | 信号量

文章目录 一、system V共享内存1. 共享内存的原理2. 共享内存相关函数3. 共享内存实现通信4. 共享内存的特点 二、system V消息队列&#xff08;了解&#xff09;三、system V信号量&#xff08;信号量&#xff09; 一、system V共享内存 1. 共享内存的原理 共享内存是一种在…

自动化测试Junit(测试系列8)

目录 前言&#xff1a; 1.什么是Junit 2.Junit相关的技术 2.1注解 2.1.1Test 2.1.2Disable 2.1.3BeforeAll和AfterAll 2.1.4BeforeEach和AfterEach 2.2参数化 2.2.1单参数 2.2.2多参数 2.2.2.1CSV获取参数 2.2.2.2方法获取参数 2.3测试套件 2.3.1通过class运行测…

Java工程师研学之路【002Java基础语法上】

知识体系&#xff08;Knowledge system&#xff09; 练习&#xff08;practice&#xff09; 要求&#xff1a;从控制台输入两个数字&#xff0c;然后输出两个数字的求和结果。 import java.util.Scanner; public class HelloJava {public static void sum(){System.out.print…

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…

以数据要素为支点,兴业银行撬动企业“技术杠杆”

文 | 螳螂观察 作者 | 李永华 推荐理财产品&#xff0c;恰好符合客户能承受的风险水平和想要的收益率水平&#xff0c;在资金投入上也契合客户当下的财务安排&#xff0c;于是顺利成交&#xff1b; 为客户办理的信用卡&#xff0c;优惠的场景方向与客户常常消费的领域大体一…

RWEQ模型教程

详情点击链接&#xff1a;基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 前沿 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的…