我们正在使用与-fmodule
和-fcxx-module
的clang来启用模块支持,如http://clang.llvm.org/docs/Modules.html所述。通过为我们的核心库定义模块映射,我们已经看到了构建时间的显着改进。
但是,我们有一些库标题使用pragma来禁用某些行的警告,例如:
template <typename TFloat>
static bool exactlyEqual(TFloat lhs, TFloat rhs)
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
return lhs == rhs;
#pragma clang diagnostic pop
}
当此标头作为预编译模块被拉入时,似乎clang的内部表示不保留编译指示信息,并且仍然会发出警告。由于我们将警告视为错误,因此导致编译失败。有些人可能会争辩完全禁用float-equal
,但我们还有一些其他具有不同警告的情况,我们不希望全局禁用。
我们已经在使用-Wno-system-headers
和-isystem
,因此图书馆的客户端通常不会看到这样的警告(即使没有编译指示),但这似乎不起作用标头作为模块导入。此外,我们仍然会对库内部的代码发出这些警告,其中包含标头作为非系统标头(即不使用-isystem
/使用双引号),因为模块预编译和导入也发生在这里。
我尝试使用_Pragma(...)
代替#pragma
而没有任何效果。
是否有其他方法有条件地忽略来自预编译clang模块的标头中的警告?
更新:我已在https://github.com/MikeWeller/ClangModuleWarnings上放置示例项目,以重现问题
更新:似乎[system]
模块属性将取消所有警告。然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块。如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告。