包含头文件时,路径区分大小写吗?
- 2024-10-28 08:37:00
- admin 原创
- 64
问题描述:
给定此目录树:
src/MyLibrary/MyHeader.h
src/file.cpp
file.cpp:
#include "mylibrary/myheader.h"
...
编译 file.cpp 在 VS 中有效,但在 gcc 中失败。
标准是怎么说的?
如果路径区分大小写,为什么这是明智的?
最佳做法是什么,保持所有文件/文件夹名称小写,从而在包含时执行相同的操作?
谢谢。
解决方案 1:
大小写敏感度取决于操作系统。Windows 不区分大小写。Linux 区分大小写。
编辑:
实际上,正如Martin York的评论所观察到的,大小写敏感性取决于文件系统。默认情况下,Windows 使用不区分大小写的文件系统,而 Linux 使用区分大小写的文件系统。对于那些有兴趣知道哪些文件系统区分大小写、哪些不区分大小写的人来说,维基百科上有一个完整的列表:文件名限制比较。
解决方案 2:
标准是怎么说的?
指令中的大小写敏感性#include
由实现(编译器/预处理器)控制。这在 16.2.2 [cpp.include] 中进行了解释:
格式为 的预处理指令在
# include < h-char-sequence> new-line
一系列由实现定义的位置中搜索由
<
和>
分隔符之间指定的序列唯一标识的标头,并导致该指令被标头的整个内容替换。如何指定位置或标识标头由实现定义。
类似地,16.2.3 [cpp.include]:
格式为 的预处理指令
# include " q-char-sequence" new-line
会导致该指令被由分隔符之间指定的序列标识的源文件的全部内容替换
"
。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,则重新处理该指令,就好像它使用原始指令中
# include < h-char-sequence> new-line
相同的包含序列(包括
>
字符,如果有)读取一样。
语言实现的自然选择是使用文件系统或操作系统的区分大小写,但并没有严格的要求这样做(正如所有其他答案所暗示的那样)。
最佳做法是什么,保持所有文件/文件夹名称小写,从而在包含时执行相同的操作?
一如既往的最佳实践:保持一致。如果您在项目中使用大小写混合的源文件/头文件,请继续使用它们并在指令中复制确切的大小写#include
。
解决方案 3:
另一点要记住的是路径分隔符。尽管 Visual Studio(我相信还有其他 Windows IDE)会接受 '/' 或 '\',但为了便于移植,您应始终在包含路径中使用 '/'。
解决方案 4:
这不是 C++ 标准,而是 Linux 方式,所有路径名都区分大小写。最佳做法是选择您想要的任何文件名(大多为小写),并在 include 指令中使用相同的大小写。此外,始终使用相对文件路径。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件