在以下示例中:
struct Foo {
[[maybe_unused]] int member = 1;
void bar() {
[[maybe_unused]] int local = 0;
}
};
int main(int argc, char* argv[]) {
Foo f{};
f.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC 发出警告,其中 Clang 和 MSVC 没有:
warning: 'maybe_unused' attribute ignored [-Wattributes]
[[maybe_unused]] int member = 1;
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该是合法的(并且不会被编译器忽略)。根据标准:
10.6.7 可能未使用的属性 [dcl.attr.unused]
...
2. 该属性可以应用于类的声明、typedef-name、变量、非静态数据成员、函数、枚举,或枚举器。
...
我讨厌在“编译器错误”锤子上摇摆不定,但我不确定在这种情况下还有什么可能。
有没有人有任何见解?
我过去遇到过这个问题:LLVM定义__GNUC__,但它不能消耗GCC可以的程序.我在Windows上再次遇到它:LLVM定义_MSC_VER,但它不能使用VC++可以使用的相同程序.加重的事情(对我来说)是我们有LLVM Clang和Apple Clang的特殊代码路径(由于不同的版本方案而定义不同),我们必须与该工具对抗以使其使用它们.
我们如何告诉Clang不要假装成其他编译器?有没有开关或选项吗?
Clang文档讨论了不需要的MS行为,但他们没有说如何阻止它:
为了与使用MSVC编译的现有代码兼容,clang定义了_MSC_VER和_MSC_FULL_VER宏.这些默认值分别为1800和180000000,使得clang看起来像Visual C++ 2013的早期版本.-fms-compatibility-version = flag会覆盖这些值.它接受虚线版本元组,例如19.00.23506.更改MSVC兼容性版本使clang表现得更像MSVC版本.例如,-fms-compatibility-version = 19将启用C++ 14功能,并将char16_t和char32_t定义为内置类型.
我想std::experimental::filesystem在我的代码中使用,这要求我使用-lstdc++fsGCC和-lc++experimentalClang 进行编译。目前,我有一个makefile,makefile.clang反映了编译方面的差异,或者,我考虑过使用clang构建目标,以便可以运行build clang。
有一些规范的方法可以在Makefile中设置特定于编译器的标志吗?
我有一组 C 程序,通常在 makefile 中使用 gcc 进行编译,但 OSX Mavericks 现在使用 clang。在 makefile 中测试现有编译器并使用适当的编译器的好方法是什么?此外,我还想使用依赖于体系结构的优化标志(例如,对于 Linux 上的 gcc,我将使用 -O3,但在 OSX 上我将使用 -fast;对于 OSX 上的 clang,我将使用 -Ofast)。
最诚挚的感谢,
瑞安