2010-08-11 2 views
19

У меня есть таблица поиска, как указано ниже, и я использую 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}}}; 
+0

У меня такая же проблема, только я застрял с ОШИБКОЙ. «error: скобки вокруг скалярного инициализатора для типа« float »». Я был бы рад, если бы знал, как сделать это предупреждением компилятора, поскольку код, который мне нужно скомпилировать, не редактируется. – user297500

+0

@ user297500, инициализировать с помощью '0.f' –

ответ

16

Вы должны удалить фигурные скобки: { и } вокруг отдельных значений.

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}}}; 

не будет предупреждать.

3

Это означает, что вам не нужно ставить брекеты в таких местах, как:

{74.216972}, 

В основном, все брекеты у вас есть есть опция (за исключением наружных), однако, вы получите другое предупреждение для не включая вложенные структуры в инициализаторе. В принципе, если вы не против предупреждения, поместите скобки только для вложенных структур и массивов; если нет, используйте их для улучшения удобочитаемости по своему усмотрению.

2

Вы инициализируете скалярные значения (скорость1, темп и т. Д.), Окружая их скобками, что не требуется.

Попробуйте это:

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

Это скаляр инициализатор: 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}, 
... 

Ваш код будет работать, он просто имеет избыточные фигурные скобки вокруг своих скалярных инициализаторов. Если вы возьмете фигурные скобки и отформатируйте их немного красивее (я бы поставил первый инициализатор на свою линию), в этом не будет никаких возражений.

16

В языке C это вполне допустимо использовать дополнительные скобки при инициализации скалярного значения, как и в

int x = { 5 }; 

даже если вы не будете обычно видеть это в реальной жизни коде. В вашем случае вы делаете то же самое, за исключением того, что в вашем случае скалярное значение является членом большего агрегата.

GCC генерирует предупреждения для такого кода. Он полагает, что возможно, что вы написали что-то, что вы не намеревались написать, так как скобки большую часть времени используются для запуска инициализатора с несколькими частями для агрегата, а не для автономного инициализатора для скаляра.

<rant> GCC определенно завинчивает вещи своими предупреждениями о фигурных скобках в совокупных инициализаторах. На языке C { 0 } всегда использовался как идиоматический универсальный нулевой инициализатор.По крайней мере, { 0 } должно быть освобождено от предупреждений, связанных с привязкой, для его идиоматического значения. </rant>

+0

Означает ли это, что' {0} 'также должен быть вполне законным инициализатором для агрегата, чей первый член является другим агрегатом? – jamesdlin

+2

@jamesdlin: Да. Нет необходимости открывать выделенный уровень '{}' для каждого вложенного агрегата. GCC выдаст предупреждение, хотя - другое место, где им удалось сломать '{0}' идиому с раздражающими предупреждениями. – AnT

+0

Это тоже меня раздражает. Я продолжаю получать предупреждения о множестве ситуаций, когда я хочу, чтобы структура инициализировалась до нуля с помощью '= {0};' и она стонает. Они должны сделать специальный случай для '= {0};' и облегчить предупреждения. –

Смежные вопросы