2009-12-23 81 views
8

鉴于这种目录树:包含头文件时,路径是否区分大小写?

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

file.cpp: 

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

编译file.cpp可与VS,失败的GCC。

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

谢谢。

回答

21

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

编辑:

实际上,通过Martin York的评论所观察到的情况下的灵敏度取决于文件系统上。默认情况下,Windows使用不区分大小写的文件系统,而Linux使用区分大小写的文件系统。对于谁有兴趣知道哪些文件系统区分大小写,哪些不是,在Wikipedia上有一个全面的列表:Comparison of file name limitations

+0

实际上,它更多地涉及到文件系统而非操作系统。默认值如上定义。但是在Linux上,有更多的文件系统可供选择,其中一些文件系统不适合大多数情况。 – 2009-12-23 19:41:54

+0

@Martin:是的,你说得对。感谢您的准确观察。 – 2009-12-23 20:09:26

+1

因此,C89/99/++ 11没有指定区分大小写?还是标准说搜索路径和文件名是不区分大小写的? – 2014-01-22 18:11:04

0

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

+0

恐怕你错了。它是** C++标准控制它,并允许任何实现执行搜索,因为它认为合适。 – IInspectable 2016-05-14 15:33:55

1

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

+2

为了更好的可移植性,例如移动源文件,路径不应该在源代码中,而应该赋予编译器。如果头文件移动,那么所有通过路径引用它们的代码都必须改变并进行回归测试! – 2009-12-23 18:28:59

+0

@ThomasMatthews我从来没有想到这一点。你如何包含你的头文件而不使用它们各自的子文件夹呢? – NicoBerrogorry 2018-02-21 15:27:01

1

该标准说的是什么?

#include指令的区分大小写由实现(编译器/预处理器)控制。

形式的预处理指令
# include < h-char-sequence> new-line
搜索的实现所定义的地方的序列用于由<之间的指定序列唯一地识别的报头:这是下16.2.2 [cpp.include]解释和>分隔符,并使标题的全部内容替换该指示符。 如何指定地点或标识的标题是实施定义的。

同样,16.2.3 [cpp.include]:

形式
# include " q-char-sequence" new-line
的预处理指令由标识的源文件的全部内容使得更换该指令的按指定的"分隔符之间的顺序排列。以实现定义的方式搜索指定的源文件。如果该搜索不被支持,或者如果搜索失败,则该指令被处理是否它与含有相同序列从原始指令读
# include < h-char-sequence> new-line
(包括>字符,如果有的话)重新处理。

实现该语言的一种自然选择是使用文件系统或操作系统的区分大小写,但没有严格的要求(如所有其他答案所示)。

什么是最好的做法,保持所有的文件/文件夹名称小写,因此包括时做相同?

最佳实践一如既往:保持一致。如果您在项目中使用混合大小写的源代码/头文件,请继续使用它们并复制#include指令中的确切框。