で Clang の警告を無視する場合は、有効にする(または、それも含まれる を使用する)-Wno-missing-braces
ことをお勧めします。そうしないと、次の例のような有用な警告を見逃すことになります。-Wmissing-field-initializers
-Wextra
#include <cstdio>
struct A
{
int i;
int arr[2];
int j;
};
void print(const A& a)
{
printf("i=%d, arr={%d,%d}, j=%d\n", a.i, a.arr[0], a.arr[1], a.j);
}
int main() {
A a = {1, 2, 3}; // this is the critical line
print(a); // output: i=1, arr={2,3}, j=0
A b = {1, {2}, 3};
print(b); // output: i=1, arr={2,0}, j=3
A c = {1, {2,0}, 3};
print(c); // output: i=1, arr={2,0}, j=3
return 0;
}
$ clang++ -Wall example.cpp
example.cpp:16:13: warning: suggest braces around initialization of
subobject [-Wmissing-braces]
A a = {1, 2, 3};
^~~~
{ }
1 warning generated.
$ clang++ -Wall -Wno-missing-braces example.cpp
(no warnings)
$ clang++ -Wall -Wno-missing-braces -Wmissing-field-initializers example.cpp
example.cpp:16:17: warning: missing field 'j' initializer
[-Wmissing-field-initializers]
A a = {1, 2, 3};
^
1 warning generated.
$ clang++ --version
clang version 3.8.1 (tags/RELEASE_381/final)
比較のために、これはGCCが行うことです:
$ g++ -Wall -Wextra example.cpp
(no warning)
$ g++ -Wall -Wmissing-field-initializers example.cpp
example.cpp: In function ‘int main()’
example.cpp:16:17: warning: missing initializer for member ‘A::j’ [-Wmissing-field-initializers]
A a = {1, 2, 3};
^
要約すれば:
- Clang の場合、
-Wno-missing-braces -Wmissing-field-initializers
他の有用な警告を失うことなく、警告を黙らせることをお勧めします
- 元の例では GCC は文句を言わない
std::array<int, 1> x = { 0 };
ので、警告を無効にする必要はありません。ただし、 では有効にならないため、有効にする-Wmissing-field-initializers
(または使用する-Wextra
)ことをお勧めし-Wall
ます。