предупреждение gcc: фигурные скобки вокруг скалярного инициализатора
у меня есть таблица поиска, как определено ниже, и я использую GCC. Когда я компилирую, я получаю предупреждения как
warning: braces around scalar initializer
что означает это предупреждение? Как инициализировать этот LUT? Я делаю ошибку, инициализируя эти структуры?
помогите!!
typedef struct TECH
{
float velocity1, velocity2;
float temp;
float measure;
int id;
float storage[64];
}TECH;
struct TECH lut_model_1[2] = {{{296.001465},
{74.216972},
{2.025908},
{1.516384},
{1},
{0.001746,
0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120,
0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700,
0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940,
-0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}},
{{309.270569},
{74.520226},
{2.088673},
{1.595730},
{1},
{-0.003261,
0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850,
0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189,
0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068,
-0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}};
5 ответов
вы должны удалить скобки: {
и }
вокруг одного значения.
struct TECH lut_model_1[2] = {{296.001465,
74.216972,
2.025908,
1.516384,
1,
{0.001746,
0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120,
0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700,
0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940,
-0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}},
{309.270569,
74.520226,
2.088673,
1.595730,
1,
{-0.003261,
0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850,
0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189,
0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068,
-0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}};
не даст никакого предупреждения.
в языке C совершенно законно использовать дополнительные фигурные скобки при инициализации скалярного значения, как в
int x = { 5 };
даже если вы обычно не увидеть это в реальном коде. В вашем случае вы делаете то же самое, за исключением того, что в вашем случае скалярное значение является членом большей совокупности.
GCC генерирует предупреждения для такого кода. Он считает, что возможно, что вы написали что-то, что вы не собирались писать, так как брекеты большую часть времени используется для запуска многосоставного инициализатора для агрегата, а не автономного инициализатора для скаляра.
<rant>
GCC определенно портит вещи своими предупреждениями о фигурных скобках в агрегатных инициализаторах. На языке C { 0 }
всегда использовался в качестве идиоматического универсального нулевого инициализатора. По крайней мере!--2--> должен был быть освобожден от предупреждений, связанных с скобками, для его идиоматического значения.</rant>
это скалярный инициализатор:int foo = 3;
Это скалярный инициализатор с фигурными скобками вокруг него:int foo = {3};
Это инициализатор массива, который не является скалярным:int foo[] = {1, 2, 3};
в предупреждении говорится, что ваша структура имеет скалярные инициализаторы с фигурными скобками вокруг них:
typedef struct TECH
{
float velocity1, velocity2;
...
struct TECH lut_model_1[2] = {{{296.001465},
{74.216972},
...
ваш код будет работать, он просто имеет лишние скобки вокруг своих скалярных инициализаторов. Если вы вытащите фигурные скобки и отформатируете их немного более красиво (я бы поставил первый инициализатор его собственная линия) в этом не будет ничего предосудительного.
это означает, что вам не нужно ставить фигурные скобки в таких местах, как:
{74.216972},
в принципе, все фигурные скобки, которые у вас есть, являются необязательными (кроме внешних), однако вы получите другое предупреждение за не охватывающие вложенные структуры в инициализаторе. В принципе, если вы не против предупреждения, поместите фигурные скобки только вокруг вложенных структур и массивов; если нет, используйте их для улучшения читаемости, как вам нравится.
вы инициализируете скалярные значения (velocity1, temp и т. д.), окружая их фигурными скобками, что не требуется.
попробуйте это:
struct TECH lut_model_1[2] = {{296.001465,
74.216972,
2.025908,
1.516384,
1,
{0.001746,
0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120,
0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700,
0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940,
-0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}},
{309.270569,
74.520226,
2.088673,
1.595730,
1,
{-0.003261,
0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850,
0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189,
0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068,
-0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}};