包含头文件时,path是否区分大小写?

鉴于这个目录树:

src/MyLibrary/MyHeader.h src/file.cpp file.cpp: #include "mylibrary/myheader.h" ... 

编译file.cpp与VS一起工作,在gcc中失败。

  • 标准说什么?
  • 如果path区分大小写,为什么这是明智的?
  • 什么是最好的做法,保持所有文件/文件夹名称小写,因此包括时做相同?

谢谢。

区分大小写取决于操作系统。 Windows不区分大小写。 Linux是。

编辑:

事实上,正如马丁·约克的评论所指出的,区分大小写取决于文件系统。 默认情况下,Windows使用不区分大小写的文件系统,而Linux使用区分大小写的文件系统。 对于有兴趣知道哪些文件系统是区分大小写的文件系统的人,维基百科上有一个全面的列表: 比较文件名限制 。

还有一点需要记住的是路径分隔符 即使Visual Studio(和其他Windows IDE我确定)将接受“/”或“\”,您应该始终在包含路径中使用“/”来实现可移植性。

它不是C ++标准,它的Linux方式,所有的路径名都是区分大小写的。 最好的做法是选择你想要的任何文件名(大多数是小写),并在include指令中使用相同的大小写。 也总是使用相对的文件路径。

标准说什么?

#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指令中复制确切的外壳。