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

Ida*_*n K 12 c++ linux windows gcc visual-studio

鉴于此目录树:

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

file.cpp:

#include "mylibrary/myheader.h"
...
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Dan*_*llo 24

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

编辑:

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

  • 不,抱歉,它既不是操作系统也不是文件系统,如[我的答案](http://stackoverflow.com/a/372​​28442/1889329)中所述。 (2认同)

IIn*_*ble 5

标准怎么说?

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