首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >gcc警告:标量初始值设定项周围有大括号

gcc警告:标量初始值设定项周围有大括号
EN

Stack Overflow用户
提问于 2010-08-12 04:27:18
回答 5查看 77.6K关注 0票数 26

我有如下定义的查找表,我使用的是GCC。当我编译的时候,我得到的警告是

代码语言:javascript
复制
warning: braces around scalar initializer

这个警告是什么意思?我应该如何初始化这个LUT?我是不是在初始化这个结构时犯了一个错误?

救命!!

代码语言:javascript
复制
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}}};
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-12 04:31:02

您应该删除单个值两边的大括号:{}

代码语言:javascript
复制
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}}};

不会给出任何警告。

票数 27
EN

Stack Overflow用户

发布于 2010-08-12 04:56:39

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

代码语言:javascript
复制
int x = { 5 };

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

GCC为这样的代码生成警告。它认为你可能写了一些你不想写的东西,因为大多数时候大括号是用来启动聚合的多部分初始化器,而不是标量的独立初始化器。

<rant>GCC关于聚合初始化器中的花括号的警告肯定是把事情搞砸了。在C语言中,{ 0 }一直被用作通用的零初始化器。至少应该让{ 0 }免除与大括号相关的警告,因为它的惯用值。</rant>

票数 19
EN

Stack Overflow用户

发布于 2010-08-12 04:48:23

这是一个标量初始化器:int foo = 3;

这是一个带大括号的标量初始化器:int foo = {3};

这是一个数组的初始值设定项,它不是标量:int foo[] = {1, 2, 3};

警告说你的struct有带大括号的标量初始化器:

代码语言:javascript
复制
typedef struct TECH
{

    float velocity1, velocity2;
...

struct TECH lut_model_1[2] = {{{296.001465},
    {74.216972},
...

你的代码将会工作,它只是在标量初始化器周围有多余的花括号。如果您去掉大括号并将其格式化得更好一点(我会将第一个初始化器放在它自己的行上),就不会有什么令人反感的地方了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3462513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档