當忽略與-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)
爲了便於比較,這是海灣合作委員會的作用:
$ 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};
^
總結:
- 對於鐺,我會建議
-Wno-missing-braces -Wmissing-field-initializers
在不丟失其他有用警告的情況下使警告消失
- GCC在原始
std::array<int, 1> x = { 0 };
示例中沒有抱怨,因此不需要禁用任何警告。但是,我建議啓用-Wmissing-field-initializers
(或使用-Wextra
),因爲它不是由-Wall
啓用的。
因爲std :: array是一個聚合。 看到這個[thread] [1]。 [1]:http://stackoverflow.com/questions/16341118/whats-the-correct-way-to-initialize-a-member-array-with-an-initializer-list –
只是爲了告知:爲禁用此警告,應該在clang上添加-Wno-missing-括號 –