Visual Studio 2022-C语言如何防止头文件多次引入

头文件的包含

本地⽂件包含

 #include "filename"

查找策略:先在源⽂件所在⽬录下查找,如果该头⽂件未找到,编译器就像查找库函数头⽂件⼀样在

标准位置查找头⽂件。

如果找不到就提⽰编译错误。

Linux环境的标准头⽂件的路径:

1 /usr/include

VS环境的标准头⽂件的路径:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include

//这是VS2013的默认路径

库⽂件包含

1 #include <filename.h>

查找头⽂件直接去标准路径下去查

找,如果找不到就提⽰编译错误。

这样是不是可以说,对于库⽂件也可以使⽤ “” 的形式包含?

答案是肯定的,可以,但是这样做查找的效率就低些,当然这样也不容易区分是库⽂件还是本地⽂件 了。

总结

“”双引号 先去文件找,找不到去标准头文件里面去找(范围较大)

<>直接去标准库文件里面去查找

分开定义的目的是效率比较高

———————————————————————————————————————————

如何防止头文件多次引入

这里就是头文件包含五次,我们需要知道头文件是不能相互包含的

如何解决这个问题

#pragma()

这个是默认对齐数

 #pragma once(解决方式1)

`#pragma once` 是一个编译器指令,它告诉编译器在包含文件的任何地方只包含该文件一次,即它实现了文件级别的重复包含保护。这个指令被广泛支持,但并非所有编译器都必须遵守。
在 C 和 C++ 编程中,头文件通常包含宏定义、函数原型和类声明等,这些内容在被多个源文件包含时可能会被多次编译,导致代码冗余和可能的冲突。

使用 `#pragma once` 可以避免这种情况。
当编译器遇到 `#pragma once` 指令时,它会检查该文件是否已经被包含过。如果文件尚未被包含,编译器将继续包含该文件并继续编译;如果文件已经被包含,编译器将忽略该文件,不会重复包含。
这里有一个简单的例子:


// header.h
#pragma once
// 一些宏定义和函数原型
#define MY_MACRO 1
void function();
// main.c
#include "header.h"
int main() {// 使用宏和函数printf("%d\n", MY_MACRO);function();// header.h 不会被重复包含#include "header.h"// 这里不会引起编译错误,因为 header.h 已经被包含过了
}

在这个例子中,`header.h` 文件中包含了 `#pragma once` 指令。当 `main.c` 文件包含 `header.h` 时,`#pragma once` 确保了 `header.h` 中的内容不会因为多次包含而重复编译。因此,即使 `#include "header.h"` 在 `main.c` 文件中被重复写了一次,它也不会对 `header.h` 产生第二次包含的效果。
需要注意的是,`#pragma once` 并不是 C 或 C++ 标准的一部分,它的支持取决于具体的编译器。然而,由于它非常简单且易于实现,大多数现代编译器都支持这个指令。

#ifndef +#define解决方式2

 每个头⽂件的开头写:

#ifndef __TEST_H__

#define __TEST_H__

//头⽂件的内容

#endif //__TEST_H__

什么意思呢,也就是首先我们判断

1,宏是否被定义没有则继续执行

 2,宏是否被定义,定义了则不执行

补充说明 

  • #ifdef 指令检查是否已经定义了某个宏。如果该宏已定义,则执行 #ifdef 和相应的 #endif 指令之间的代码。
  • #ifndef 指令检查是否没有定义某个宏。如果没有定义该宏,则执行 #ifndef 和相应的 #endif 指令之间的代码。

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

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

相关文章

如何自定义项目启动时的图案

说明&#xff1a;有的项目启动时&#xff0c;会在控制台输出下面的图案。本文介绍Spring Boot项目如何自定义项目启动时的图案&#xff1b; 生成字符图案 首先&#xff0c;找到一张需要设置的图片&#xff0c;使用下面的代码&#xff0c;将图片转为字符文件&#xff1b; impo…

【Unity每日一记】鼠标相关API

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【WPF应用38】WPF 控件打开文件选择-OpenFileDialog的详解与示例

在 WPF 应用程序中&#xff0c;经常需要让用户选择文件&#xff0c;例如打开图片、文本文件等。OpenFileDialog 是一个用于实现这个功能的控件。本文将详细介绍 OpenFileDialog 的使用流程&#xff0c;并提供一个完整的示例代码。 一、WPF 控件打开文件选择的必要性 在 WPF 应…

Linux初学(十七)redis

一、简介 redis就是一个内存数据库 redis中的数据&#xff0c;都是保存在内存中 端口&#xff1a;6379 二、安装redis 方法一&#xff1a;编译安装 方法二&#xff1a;yum安装-epel 第一步&#xff1a;配置epel源 详见&#xff1a;http://t.csdnimg.cn/AFl1K第二步&#xff1a…

GaN肖特基势垒二极管(SBD)的多阴极应用建模与参数提取

GaN Schottky Barrier Diode (SBD) Modeling and Parameter Extraction for Multicathode Application&#xff08;TED 24年&#xff09; 摘要 本文提出了一种适用于多阴极应用的紧凑型可扩展GaN肖特基二极管大信号模型。详细给出了外在和内在模型参数的可扩展规则。实验和理…

kamailio mysql数据表解析

kamctl db exec "show tables;" 查询mysql数据表 acc&#xff1a;存储呼叫详单&#xff08;Call Detail Records, CDRs&#xff09;的信息&#xff0c;包括呼叫持续时间、呼叫状态、被叫号码等。这些记录有助于统计和分析呼叫的数据。 acc_cdrs&#xff1a;存储呼叫…

HTTP的强制缓存和协商缓存

HTTP的强制缓存和协商缓存 HTTP的缓存技术强制缓存ExpiresCache-Control 协商缓存If-Modified-Since和Last-ModifiedIf-None-Match和ETag优先级 可被缓存的请求方法总结 HTTP的缓存技术 当我们进行HTTP请求时&#xff0c;需要将请求报文发送给对端&#xff0c;当服务端收到请求…

Stm32 HAL库 访问内部flash空间

Stm32 HAL库 访问内部flash空间 代码的部分串口配置申明文件main函数 在一些时候&#xff0c;需要存储一些数据&#xff0c;但是又不想接外部的flash&#xff0c;那我们可以知道&#xff0c;其实还有内部的flash可以使用&#xff0c; 需要注意的是内部flash&#xff0c;读写次数…

书生浦语训练营二期第三次作业

文章目录 基础作业1. 在茴香豆 Web 版中创建自己领域的知识问答助手第一轮对话第二轮对话第三轮对话第四轮对话第五轮对话 2.在 InternLM Studio 上部署茴香豆技术助手修改配置文件创建知识库运行茴香豆知识助手 基础作业 1. 在茴香豆 Web 版中创建自己领域的知识问答助手 我…

【Docker常用命令(四)】

目录 Docker常用命令&#xff08;四&#xff09;注意 Docker常用命令&#xff08;四&#xff09; docker pause docker pause 命令用于暂停容器中的所有进程。docker pause CONTAINER [CONTAINER...]常用子命令和选项&#xff1a;无特定常用选项。docker port docker port 命令…

神经网络中的超参数调整

背景 在深度神经网络学习和优化中&#xff0c;超参数调整一项必备技能&#xff0c;通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态&#xff0c;及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数&#x…

iOS 17.5系统或可识别并禁用未知跟踪器,苹果Find My技术应用越来越合理

苹果公司去年与谷歌合作&#xff0c;宣布将制定新的行业标准来解决人们日益关注的跟踪器隐私问题。苹果计划在即将发布的 iOS 17.5 系统中加入这项提升用户隐私保护的新功能。 科技网站 9to5Mac 在苹果发布的 iOS 17.5 开发者测试版内部代码中发现了这项反跟踪功能的蛛丝马迹…

XML HTTP传输 小结

what’s XML XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传输和存储数据&#xff0c;不用于表现和展示数据&#xff0c;HTML 则用来表现数据。 XML 是独立于软件和硬件的信息传输工具。 应该掌握的基础知识 HTMLJavaScript…

使用pytorch构建有监督的条件GAN(conditional GAN)网络模型

本文为此系列的第四篇conditional GAN&#xff0c;上一篇为WGAN-GP。文中在无监督的基础上重点讲解作为有监督对比无监督的差异&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 有条件与无条件 如图投进硬币随机得到一个乒乓球的例子可以看成是一个无监督的GAN&…

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1&#xff09;创建基本框架&#xff08;生成index.rst &#xff1b;conf.py&#xff09; conf.py默认内容 index.rst默认内容 2&#xff09;生成页面&#xff08;Windows系统下&#xf…

实战webSocket压测(三)Jmeter真实接口联调

背景&#xff1a; 接口地址为&#xff1a;ws://sunlei.demo 接口说明&#xff1a;websocket接口&#xff0c;首次连接&#xff0c;通过Text请求设置开启标志&#xff0c;然后通过wav文件流传输&#xff0c;达到后端服务可以根据传输信息进行解析满足指定标准后&#xff0c;web…

前端开发语言有哪些?

前端开发语言是指用于开发网页和网站前端部分的编程语言。随着互联网的发展&#xff0c;前端开发越发重要&#xff0c;也涌现出了许多前端开发语言。本文将介绍一些常见的前端开发语言。 HTML&#xff08;超文本标记语言&#xff09;&#xff1a;HTML是一种用于描述网页结构和内…

锂电池算法学习集合---基于matlab/simulink的电池参数辨识、充放电、SOC估计算法。

整理了锂电池的多种算法合集&#xff1a;涵盖电动汽车Simulink模型、电动汽车动力电池SOC估算模型、动力电池及电池管理系统BMS。 电动汽车动力电池SOC估算模型含有:电池参数辨识模型、电池的充放电数据、电池手册、卡尔曼滤波电池SOC文献、卡尔曼滤波算法的锂电池SOC估算模型…

C++ | Leetcode C++题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution { public:int threeSumClosest(vector<int>& nums, int target) {sort(nums.begin(), nums.end());int n nums.size();int best 1e7;// 根据差值的绝对值来更新答案auto update [&](int cur) {if (abs(cur…

Linux 上安装 SQLite

SQLite Download Page 从上面的链接中源代码区下载 sqlite-autoconf-*.tar.gz。 历史版本见下连接&#xff1a; https://sqlite.org/chronology.html