头文件保护符&头文件中的“”和<>- -C++

本文探讨了C++中头文件保护符#pragmaonce与传统#ifndef方法的使用,以及头文件包含的区别,包括库文件和自定义文件的包含规范,以及避免重复定义的关键技巧。

头文件保护符&头文件中的“”和<>


参考:
#pragma once
wiki:include guard

头文件保护符

在C++中我们写头文件时经常需要#include来包含其他头文件。头文件定义的实体经常使用其他头文件的内容,有时候会出现一个头文件被多次包含进同一源文件。

例如
1.有一个头文件log.h(其中定义了一个struct),如果在一个cpp文件中多次包含此头文件,会出现重复定义的情况。
2.有一个头文件log.h(其中定义了一个struct),另一个头文件test.h((其中定义了一个struct))包含了log.h,如果在一个cpp文件中包含这两个头文件,则会出现重复定义的情况。

#pragma once

这种方式是C++ 11新标准中的一部分
支持#pragma once的编译器
基本上为所有编译器支持,而且比下面这种方式更加高效。

#ifndef XXX
#define XXX
#endif

测试代码:
log.h

//#pragma once

  struct Haha{

};

test.cpp

#include "log.h"
#include "log.h"
using namespace std;

int main()
{
  return 0;
}

error
redefinition of 'struct Haha’

常规方法(#ifndef…)

测试代码:
log.h

#ifndef _LOG_
  #define _LOG_
  struct Haha{

};

#endif // _LOG_

test.cpp

#include "log.h"
#include "log.h"
using namespace std;

int main()
{
  return 0;
}

error
redefinition of 'struct Haha’

头文件包含

头文件包含一般有两种方式,“ ”和< >
这两种方式的区别:

#include <iostream>	//库提供的头文件
#include "../iostream"	//库提供的头文件,包含路径

//Log.h为用户自定义头文件
#include <Log.h>
#include "Log.h"
#include "../Log.h" 

一般来说,<>用于标准头文件的使用,直接使用头文件名即可。
" "可以用于用户自定义头文件的使用,可以包含路径。

" "应用的范围更广,既可以是标准头文件,也可以是自定义头文件。既可以直接包含文件名,也可以设置路径。

### C++ 头文件 `&lt; &gt;` `.h` 的区别及使用场景 #### 一、基本概念 C++ 中的头文件可以通过 `#include &lt;...&gt;` 或者 `#include &quot;...&quot;` 进行引入。这两种方式的主要区别在于它们的作用范围以及编译器处理的方式。 - **尖括号 `&lt; &gt;` 方式的用途** 尖括号主要用于包含标准库头文件,这些文件是由编译器提供并预先安装好的[^3]。例如,`&lt;iostream&gt;`, `&lt;vector&gt;`, `&lt;string&gt;` 都属于此类头文件。当使用这种形式时,编译器会在系统的默认路径下寻找对应的头文件[^4]。 - **双引号 `&quot; &quot;` 方式的用途** 双引号则用来指定用户自定义或者特定项目的头文件位置。这种方式允许开发者引用本地目录下的文件或者是项目内部创建的头文件。比如,如果你有一个名为 `utils.h` 的文件位于当前工作目录中,则可以这样写:`#include &quot;utils.h&quot;`[^5]。 #### 二、`.h` 文件的特点及其适用场合 `.h` 是传统意义上的头文件扩展名,在早期 C 语言编程实践中广泛采用,并延续到了 C++ 编程环境中[^1]。它通常包含了函数声明、宏定义以及其他必要的接口描述等内容以便多个源码模块共享相同的逻辑结构而不必重复实现相同部分。 对于一些跨平台的应用程序来说,继续沿用 `.h` 扩展名有助于保持兼容性一致性,特别是在那些既支持 C 又支持 C++ 的混合型工程里显得尤为重要[^2]。 然而需要注意的是,随着现代软件开发技术的发展趋势变化,越来越多的新建工程项目更倾向于统一命名约定为 `.hpp`(代表 Header Plus Plus),旨在强调其专属于 C++ 特性的事实同时减少混淆可能性. #### 三、总结对比表 | 特性 | `&lt; &gt;` 形式 | `&quot; &quot;` 形式 | |--------------------|-------------------------------|-----------------------------| | 主要作用 | 包含标准库头文件 | 引入用户定义或项目专属头文件 | | 查找顺序 | 系统预设路径 | 先查当前目录后转至系统路径 | | 常见例子 | `&lt;iostream&gt;`,`&lt;cmath&gt;` | `&quot;config.h&quot;`,`&quot;logger.hpp&quot;` | ```cpp // 正确示范 #include &lt;iostream&gt; #include &quot;custom_class.hpp&quot; int main() { std::cout &lt;&lt; &quot;Hello World!&quot; &lt;&lt; std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值