【问题标题】:Is there a way to make Visual Studio case sensitive on includes?有没有办法让 Visual Studio 在包含时区分大小写?
【发布时间】:2014-06-10 21:03:33
【问题描述】:

Windows 对文件不区分大小写,但 Linux 区分大小写。当您在 Linux 上进行开发并注意到 Windows 团队并不关心这一点时,这真的很烦人。

有没有办法强制 Visual Studio 对包含文件区分大小写?

我已经阅读了有关在 Linux 服务器中每次提交后进行编译并通知开发人员的解决方案,但我做不到。我需要一种方法来强制 Visual Studio 区分大小写,以便 Windows 团队可以在开发时修复它。

【问题讨论】:

  • 它与编译器无关,文件系统在Windows上不区分大小写。在 Linux 上解决此问题的典型方法是使每个文件名都小写,这样您就不必记住大小写。当然,这在 Windows 上也可以正常工作。
  • @Hans Passant:尽管它与编译器(或 IDE)无关,但它可能是一个编译器或 IDE 功能,非常有用。此外,我从未听说过 Linux 上的始终小写约定。此外,这种约定实际上在 Windows 上更有意义,因为该操作系统不会在文件名查找时强制执行正确的大小写。在 Linux 上,您可以安全地就大小写约定达成一致,并确保操作系统、编译器和 IDE 能够处理错误的大小写。一个在 Linux w.r.t 上编译良好的程序。文件名大小写将在 Windows 上编译,但不一定反之亦然。
  • VS 文本编辑器在 3 年前获得了自动完成#include 名称的能力。
  • 恕我直言,代码不应单独区分大小写来区分对象、文件名、类型等。

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


【解决方案1】:

区分大小写不取决于编译器,但 底层文件系统。所以 Linux 可能不区分大小写,如果 文件系统远程安装在 Windows 机器上,反之亦然 反之亦然。如果您想在 Windows 机器上强制区分大小写, 我知道的唯一解决方案是远程挂载文件系统 一个 Unix 盒子。

请注意,如果您正在开发,这应该不是问题 Linux,然后迁移到 Windows。这是相反的 一个问题。唯一真正的解决方案是定义并严格 强制执行命名约定。无论如何你都需要它的代码 (因为 C++ 无论如何都区分大小写)。所以如果你有 一个类FxTrade,你的编码约定应该坚持它 是Fx,而不是FX;这些公约必须在 C++ 代码,否则你会发疯,每次都必须查找 它是一个,并且在相同的代码审查中强制执行它们 source 应该在文件名中强制执行它们。

(不管怎样,修​​复这样的错误真的很痛苦 在 Subversion 下,因为 svn FXTrade.cpp FxTrade.cpp 没有 在 Windows 下工作;您必须将其移至其他名称,然后 提交,然后将其移动到您想要的名称。)

【讨论】:

  • 好的,谢谢。我一直在寻找一种方法来强制 Visual Studio 进行区分大小写的检查,即使 Windows 不敏感。如果每个人都遵循约定,那么约定非常有用...
  • @PauGuillamon 我不知道关于约定的问题。我的 cmets 主要来自个人经验,在一个项目中,FxFX 之间有很好的混合,包括文件名,以及一个文件包含 FxTrade.h 和另一个 FXTrade.h 的情况。我是将它移植到 Linux 的主要负责人之一。 (好消息是负责 Windows 构建的人员一致认为,这种名称变化是一件坏事,应该修复,即使它在 Windows 上工作。)
  • 2018 年 4 月,NTFS 变为 fully case-sensitive(按需)。不过,似乎必须修复 Visual Studio 才能正确使用此类文件夹。
  • 实际上,区分大小写确实取决于编译器。事实证明,Visual Studio 在将文件名传递给编译器之前会将其转换为大写。这导致了这里的一些主要问题。我们只有在检查CL.command.1.tlog 文件时才找到原因。即使 .vcxproj 文件显示 DllMain.c,它也会显式尝试编译 DLLMAIN.C
【解决方案2】:

自 2018 年 2 月 28 日起https://blogs.msdn.microsoft.com/commandline/2018/02/28/per-directory-case-sensitivity-and-wsl/ 您可以在 Windows 中选择文件夹是否区分大小写。

fsutil.exe file setCaseSensitiveInfo <path> enable
fsutil.exe file setCaseSensitiveInfo <path> disable

如果您愿意,该命令不能递归工作,因此您必须编写类似的内容:

$directories = Get-ChildItem $path  -Recurse -Directory

ForEach($dir In $directories)
{
    fsutil.exe file setCaseSensitiveInfo $dir.FullName enable
}

一个班轮:

$directories = Get-ChildItem $path -Recurse -Directory ForEach($dir In $directories) { fsutil.exe file setCaseSensitiveInfo $dir.FullName enable }

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多