【问题标题】:Configure OSX Clang to be case sensitive to include statements将 OSX Clang 配置为区分大小写以包含语句
【发布时间】:2014-10-03 15:51:02
【问题描述】:

我知道 C++ include 语句中区分大小写是一个文件系统问题(相关问题 herehere)。

是否可以将 Clang 配置为要求区分大小写的匹配以防止跨平台构建问题?

【问题讨论】:

  • 如果代码在区分大小写环境中工作,它也应该在不区分大小写环境中工作。在这种情况下,将 Clang 配置为区分大小写似乎不是什么跨平台问题,只是可能会更快地在区分大小写的环境中发现构建错误。
  • @user2864740:问题在于那些在不敏感环境中工作的可怜人,他们可能希望避免便携性问题。遗憾的是,并不是每个人都可以选择他们的开发环境。
  • @MikeSeymour 是的,但除非有人不小心使用了错误的大小写(现代不区分大小写的文件系统仍然存储大小写信息,因此原因是 PEBKAC),否则没有问题。并且在导入时使用错误的大小写可以说与编写其他无效/UB代码没有什么不同——这是一个代码错误。
  • @user2864740:确实,这是一个错误。但是,当错误被自动诊断出来时,可以节省很多时间——就像这个一样(至少在原则上)。因此问题是:这个编译器可以配置为诊断它吗?
  • 自 2016 年 6 月起支持此功能(无论如何以警告的形式):llvm.org/viewvc/llvm-project?view=revision&revision=272584

标签: c++ macos clang


【解决方案1】:

Clang 现在有这些警告标志:

-Wnonportable-include-path
-Wnonportable-system-include-path

第一个用于引用包含,第二个用于尖括号包含。它们甚至可以映射到错误:

-Werror=nonportable-include-path
-Werror=nonportable-system-include-path

可能默认情况下不启用它们,因为它们会减慢编译速度。我还没有花时间调查到底有多少。

【讨论】:

  • 有没有办法从 Xcode UI 打开这些?如果不是 - 我在目标构建设置中的哪个位置将自定义标志应用于 CLANG ?
  • 在项目的构建设置中有一个名为Other Warning Flags的选项。
【解决方案2】:

嗯,正如你所说,正如这些问题所说,这是一个文件系统问题。如果您将 OS X 驱动器格式化为区分大小写,那么它可能会起作用,但实际上您可能应该找到一种不同的方式来区分标头。

【讨论】:

  • 正如 Mike 评论的那样,这个想法是在编译时诊断错误。用例是一个具有可读性的大写标题,而不是区分。
  • 重新格式化似乎是一个“核选项”。从理论上讲,似乎可以使编译器比文件系统更具限制性,但这样想也许是天真的。
  • 但正如 user2864740 所说,这与任何其他代码错误没有任何不同。正如我所说,问题是因为(不敏感的)文件系统将在查询文件时将 source.cpp 和 sOuRcE.cpp 视为 IDENTICAL。它们指的是同一个文件,在不区分大小写的系统上,两个文件甚至不能以不同的大小写存在于同一个文件夹中。如果计算机甚至无法处理文件系统级别的差异,编译器怎么能?
  • 至于“用例是一个标头,它具有大写的可读性,而不是区分。”事情,我明白你的意思,但你要解决的问题是区分相同标题名称的不同大写,对吗?这就是我所指的 - 你的问题,而不是用例。
  • 是的,我明白你所说的区分是什么意思。听起来我的问题的答案是“不。编译器受文件系统的限制,不能变得更严格。”对吗?
猜你喜欢
  • 2012-02-18
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2023-03-17
相关资源
最近更新 更多