【问题标题】:Warning with struct initialization结构初始化警告
【发布时间】:2016-07-06 10:21:11
【问题描述】:

我有这个结构:

struct ChangeIntItem
{
    char *unit;
    const char **parser;
    int *changevalue;
    uint16_t *change_eeprom_value;
    int maximum;
    int minimum;
};

我想用这个结构变量初始化其他变量:

struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = {"off", "on"}};

它工作正常,但我收到一些警告:

Severity    Code    Description Project File    Line
Warning     braces around scalar initializer    Handsteuerung   C:\Users\...    11

Severity    Code    Description Project File    Line
Warning     (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung   C:\Users\...    11

Severity    Code    Description Project File    Line
Warning     initialization from incompatible pointer type   Handsteuerung   C:\Users\...    11

Severity    Code    Description Project File    Line
Warning     (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung   C:\Users\...    11

Severity    Code    Description Project File    Line
Warning     excess elements in scalar initializer   Handsteuerung   C:\Users\...    11

Severity    Code    Description Project File    Line
Warning     (near initialization for 'ChangeIntItemTypeBoolean.parser') Handsteuerung   C:\Users\...    11

在另一种情况下,我编写了一个函数,它将结构的变量设置为默认值,但我更喜欢这种方法,因为它更短。

所有由 '.parser = {"off", "on"}' 引起的错误,但我不明白我的错误...

【问题讨论】:

    标签: c struct initialization warnings


    【解决方案1】:

    你可以使用compound literals,所以把init改成

    struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
    

    测试

    #include <stdio.h>
    #include <stdint.h>
    
    struct ChangeIntItem
    {
        char *unit;
        const char **parser;
        int *changevalue;
        uint16_t *change_eeprom_value;
        int maximum;
        int minimum;
    };
    
    int main()
    {
        struct ChangeIntItem ChangeIntItemTypeBoolean = { .unit = "", .minimum = 0, .maximum = 1, .parser = (const char *[]){"off", "on"}};
    
        printf ("%s - %s\n", ChangeIntItemTypeBoolean.parser[0], ChangeIntItemTypeBoolean.parser[1]);
    }
    

    输出

    off - on
    

    【讨论】:

    • 另外,parser 可以是const char* parser[] 类型的灵活数组成员。在极少数情况下,指针到指针的变量声明是有意义的。
    • @Lundin 是的,VLA parser 应该是结构的最后一个成员,不是吗?
    • 谢谢!有时它比你想象的要容易;)
    【解决方案2】:

    成员parser 是一个指针。

    改成指针数组,这样初始化就可以保持不变:

     const char *parser[2];
    

    或者使用复合文字或其他变量:

    .parser = ( const char*[]){"off", "on"}
    
    const char* array[2] = {"off", "on"};
    .parser = array
    

    【讨论】:

    • @LPs 不,它是一个指针。短语pointer of pointers没有任何意义。
    猜你喜欢
    • 2023-03-12
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多