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

时间:2009-12-23 10:25:49

标签: c++ windows visual-studio linux gcc

鉴于此目录树:

src/MyLibrary/MyHeader.h
src/file.cpp

file.cpp:

#include "mylibrary/myheader.h"
...

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

  • 标准说什么?
  • 如果路径区分大小写,为什么这是明智的?
  • 什么是最佳做法,将所有文件/文件夹名称保持为小写,从而在包含时也这样做?

感谢。

4 个答案:

答案 0 :(得分:23)

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

编辑:

实际上,正如Martin York的评论所观察到的,区分大小写取决于文件系统。默认情况下,Windows使用不区分大小写的文件系统,而Linux使用区分大小写的文件系统。对于有兴趣知道哪些文件系统区分大小写但哪些不区分大小的人,维基百科上有一个全面的列表:Comparison of file name limitations

答案 1 :(得分:3)

  

标准说什么?

#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指令中复制确切的大小写。

答案 2 :(得分:1)

要记住的另一点是路径分隔符。尽管Visual Studio(以及我确定的其他Windows IDE)将接受'/'或'\',但您应该始终在包含路径中使用'/'来实现可移植性。

答案 3 :(得分:0)

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