Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含头文件时,路径是否区分大小写?_C++_Windows_Visual Studio_Linux_Gcc - Fatal编程技术网

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

C++ 包含头文件时,路径是否区分大小写?,c++,windows,visual-studio,linux,gcc,C++,Windows,Visual Studio,Linux,Gcc,给定此目录树: src/MyLibrary/MyHeader.h src/file.cpp file.cpp: #include "mylibrary/myheader.h" ... 编译file.cpp与VS一起工作,在gcc中失败 标准怎么说 如果路径区分大小写,为什么这样做是明智的 最好的做法是,将所有文件/文件夹名称保持小写,这样在包含时也可以这样做 谢谢。< /P> < P>不是C++标准,它是Linux方式,所有路径名称都是区分大小写的。 最佳做法是选择您想要的任何文件名(

给定此目录树:

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

file.cpp:

#include "mylibrary/myheader.h"
...
编译file.cpp与VS一起工作,在gcc中失败

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

谢谢。< /P> < P>不是C++标准,它是Linux方式,所有路径名称都是区分大小写的。


最佳做法是选择您想要的任何文件名(大部分为小写),并在include指令中使用相同的大小写。还应始终使用相对文件路径。

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

编辑:


实际上,正如作者的评论所述,区分大小写取决于文件系统。默认情况下,Windows使用不区分大小写的文件系统,而Linux使用区分大小写的文件系统。对于有兴趣知道哪些文件系统区分大小写,哪些不区分大小写的人,维基百科上有一个全面的列表:。

另一点要记住的是路径分隔符。尽管VisualStudio(以及我确信的其他Windows IDE)将接受“/”或“\”,但为了便于移植,您应该始终在include路径中使用“/”

标准怎么说

#include
指令中的大小写敏感度由实现(编译器/预处理器)控制。这在第16.2.2节[cpp.include]中解释:

格式为
#包括新行

在实现定义的位置序列中搜索由
分隔符之间的指定序列唯一标识的标头,并使该指令替换为标头的全部内容如何指定位置或如何定义标头。

同样,16.2.3[cpp.include]:

格式为
#包括“q-char-sequence”新行

使该指令被
分隔符将以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则将重新处理指令,就像读取指令一样
#包括新行

具有与原始指令相同的包含序列(包括
字符,如果有)

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

最好的做法是,将所有文件/文件夹名称保持小写,这样在包含时也可以这样做


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

为了更好地移植,例如移动源文件,路径不应在源代码中,而应提供给编译器。如果头文件移动,则必须更改所有按路径引用它们的代码并进行回归测试@托马斯马修斯,我从来没想过。那么,在不使用各自的子文件夹的情况下,您将如何包含标题?@ThomasMatthews(我只花了9年的时间来循环并回答这个问题)——我同意25000%的观点,并提倡您在我自己的工作中专门提到的方法。。。我只是在回答这个问题,但这是一个错失的机会,用更好的建议“真正”回答这个问题。荣誉实际上,它更多地与操作系统中使用的文件系统有关。默认值的定义如上所述。但是在Linux上,有更大的文件系统可供选择,其中一些文件系统不区分大小写。@Martin:是的,你说得对。感谢您的准确观察。那么C89/99/++11没有指定大小写敏感度?或者标准是否规定搜索路径和文件名不区分大小写?不,抱歉,正如中所解释的,这既不是操作系统也不是文件系统。甚至关于文件系统区分大小写的评论也是错误的。Windows主要使用NTFS。NTFS区分大小写。Windows API中的I/O实现不区分大小写。恐怕你错了。正是C++标准控制了这一点,并允许任何实现按照其适合的方式执行搜索。