如何使用#includes强制Visual Studio预处理器区分大小写?

时间:2009-07-14 00:05:15

标签: c++ visual-studio include c-preprocessor

如果您有一个名为ThisIsAHeaderFile.h的头文件,以下内容仍将在Visual Studio中找到该文件:

#include <ThisIsAheaderFile.h>

有没有办法强制区分大小写,以致#include会导致错误?

5 个答案:

答案 0 :(得分:14)

您不能,因为Windows文件系统本身不区分大小写。

如果你可能遇到同时拥有RICHIE.h和richie.h的情况,那么控制区分大小写可能是有意义的,但你不能。

答案 1 :(得分:1)

(以前是?)可以创建具有相同名称但NTFS上存在大小写差异的文件。也许有cygwin的人可以验证这一点。

MSDN

然而,即使这样,也无法从普通的Windows应用程序一次访问多个这样的应用程序。

答案 2 :(得分:1)

虽然可能无法在Visual Studio中强制执行此操作,但可以通过仅运行C / C ++源上的预处理器来实现快速检查。这将足够快地运行,即使在版本控制系统中作为后提交挂钩也是可行的,并且如果文件名中的情况不匹配则错误。所以:

  • 在Linux中配置构建系统以支持仅预处理器运行(-Egcc / g++

  • 实施仅预处理程序运行作为提交后挂钩,触发向负责人和/或愿意定期修复这些错误的人提前通知

当然,这假定VCS是代码的中央存储。

答案 3 :(得分:1)

我想指出,这是一个无法解决的问题,因为许多人试图指出OP。不区分大小写是不合时宜的。这一点是Lorenz03Tx在评论中解释的,即使文件系统是个案不在意,案例也会被保留,因此可以对其进行控制。

这样的对策在进行跨平台开发时非常棒,并且在为其他平台编译代码时会阻止很多工作。不要忘记,让构建过程更加挑剔,你会为开发人员带来更好的习惯,因为他们逐渐更加一致地包含和命名文件。

TL; DR

一种解决方案是使用一个脚本,该脚本只扫描源文件中的include语句,并尝试沿着包含路径匹配它们。这样的脚本可以添加到visual studio构建后事件中,因此可以在每次构建时运行,或者(受krlmlr启发)使用强制区分大小写的编译器的预处理器。

答案 4 :(得分:0)

FAT和NTFS都是不区分大小写的文件系统。就他们而言,Foo和fOO是相同的文件。虽然Windows操作系统将保留用于文件的大小写。如果您将文件命名为ThisIsAheaderFile.h,它将在文件系统中以这种方式显示。虽然打开该文件的所有系统函数调用都可以使用他们想要的任何外壳。