将 OSX Clang 配置为区分大小写以包含语句

Posted

技术标签:

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

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

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

【问题讨论】:

如果代码在区分大小写环境中工作,它也应该在不区分大小写环境中工作。在这种情况下,将 Clang 配置为区分大小写似乎不是什么跨平台问题,只是可能会更快地在区分大小写的环境中发现构建错误。 @user2864740:问题在于那些在不敏感环境中工作的可怜人,他们可能希望避免便携性问题。遗憾的是,并不是每个人都可以选择他们的开发环境。 @MikeSeymour 是的,但除非有人不小心使用了错误的大小写(现代不区分大小写的文件系统仍然存储大小写信息,因此原因是 PEBKAC),否则没有问题。并且在导入时使用错误的大小写可以说与编写其他无效/UB代码没有什么不同——这是一个代码错误。 @user2864740:确实,这是一个错误。但是,当错误被自动诊断出来时,可以节省很多时间——就像这个一样(至少在原则上)。因此问题是:这个编译器可以配置为诊断它吗? 自 2016 年 6 月起支持此功能(无论如何以警告的形式):llvm.org/viewvc/llvm-project?view=revision&revision=272584 【参考方案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。它们指的是同一个文件,在不区分大小写的系统上,两个文件甚至不能以不同的大小写存在于同一个文件夹中。如果计算机甚至无法处理文件系统级别的差异,编译器怎么能? 至于“用例是一个标头,它具有大写的可读性,而不是区分。”事情,我明白你的意思,但你要解决的问题是区分相同标题名称的不同大写,对吗?这就是我所指的 - 你的问题,而不是用例。 是的,我明白你所说的区分是什么意思。听起来我的问题的答案是“不。编译器受文件系统的限制,不能变得更严格。”对吗?

以上是关于将 OSX Clang 配置为区分大小写以包含语句的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Presto 搜索配置为不区分大小写?

Qt 5.1 for OSX 安装只包含 clang_64 目录,如何使用 macports gcc 编译?

不区分大小写的OSX文件系统 - 奇怪的更改目录(cd)bash行为

sh 在OSX上创建和管理区分大小写的磁盘映像。

2. SQL 语法

如何以clang格式创建外部标题的类别?