【问题标题】:gcc warning: braces around scalar initializergcc 警告:标量初始化器周围的大括号
【发布时间】:2010-08-11 20:27:17
【问题描述】:

我有如下定义的查找表,我正在使用 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}}};

【问题讨论】:

  • 我有同样的问题,只是我遇到了一个错误。 “错误:'float' 类型的标量初始值设定项大括号”。如果我知道如何让它成为编译器警告,我会很高兴,因为我需要编译的代码不是我可以编辑的。
  • @user297500,初始化为0.f

标签: c lookup-tables gcc-warning


【解决方案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}}};

不会发出警告。

【讨论】:

    【解决方案2】:

    在 C 语言中,在初始化标量值时使用额外的大括号是完全合法的,如

    int x = { 5 };
    

    即使您通常不会在实际代码中看到这一点。在您的情况下,您正在做同样的事情,除了在您的情况下标量值是更大聚合的成员。

    GCC 会为这样的代码生成警告。它认为你可能写了一些你不打算写的东西,因为花括号大部分时间用于启动聚合的多部分初始化程序,而不是标量的独立初始化程序。

    <rant>GCC 肯定会在聚合初始化器中的大括号警告中搞砸了。在 C 语言中,{ 0 } 一直被用作惯用的通用零初始化器。至少 { 0 } 应该因其惯用价值而免于与大括号相关的警告。</rant>

    【讨论】:

    • 这是否意味着{ 0 } 对于第一个成员是另一个聚合的聚合也应该是一个完全合法的初始化器?
    • @jamesdlin:是的。无需为每个嵌套聚合打开专用级别的 {}。不过 GCC 会发出警告 - 在另一个地方,他们设法用恼人的警告打破了 { 0 } 成语。
    • 这也让我很烦。我不断收到警告,因为我希望使用= {0}; 将结构初始化为零并且它会呻吟。他们应该为= {0}; 做一个特殊情况并减轻警告。
    • = {}' 不够惯用吗?请参见第 142 (160) 页的示例 4:open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
    • @Vorac:是的,我理解编号不匹配的问题,我确信我正在查看正确的示例。将聚合的“其余部分”初始化为零的功能从一开始就存在于该语言中。但是,这并不意味着= {} 语法是合法的。 C 语言语法明确要求在{} 之间至少有一个初始化程序,即= { 0 } 是将所有内容初始化为零的最短方法,而= {} 是语法错误。支持= {}的是C++,但不支持C。
    【解决方案3】:

    这是一个标量初始化器: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},
    ...
    

    您的代码可以工作,只是在标量初始化器周围有多余的大括号。如果你把大括号拿出来并更好地格式化它(我会把第一个初始化器放在它自己的行上),那就没有什么令人反感的了。

    【讨论】:

      【解决方案4】:

      这意味着您无需将大括号放在以下位置:

          {74.216972},
      

      基本上,您拥有的所有大括号都是可选的(除了外部的),但是,您会收到不同的警告,因为您在初始化程序中不包含嵌套结构。基本上,如果您介意警告,请仅在嵌套结构和数组周围放置大括号;如果没有,请根据需要使用它们来提高可读性。

      【讨论】:

        【解决方案5】:

        您可以通过用大括号括起来来初始化标量值(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}}};
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多