簡體   English   中英

指定的初始化程序:GCC警告消息:接近初始化和其他警告消息

[英]Designated Initializers: GCC warning message: near initialization and other warning messages

我試圖了解有關Linux內核中的kobject的更多信息,並且嘗試編寫使用此類工具的模塊時,我收到了錯誤和警告消息,因此在這里我將相關數據結構的精簡版本和相應的gcc的錯誤和警告消息。

$ gcc issue.c 
issue.c:30:1: error: initializer element is not constant
 } ;
 ^
issue.c:30:1: error: (near initialization for ‘first.attr’)
issue.c:34:1: error: initializer element is not constant
 }; 
 ^
issue.c:34:1: error: (near initialization for ‘second.attr’)
issue.c:39:8: warning: initialization from incompatible pointer type [enabled by default]
 struct bin_attribute *my_bin_attrs[] = { &first_bin_attrs, &second_bin_attrs };
        ^
issue.c:39:8: warning: (near initialization for ‘my_bin_attrs[0]’) [enabled by default]
issue.c:39:8: warning: initialization from incompatible pointer type [enabled by default]
issue.c:39:8: warning: (near initialization for ‘my_bin_attrs[1]’) [enabled by default]

和示例代碼:

#include <stdio.h>

struct attribute {
    const char      *name;
    unsigned short          mode;
};

struct bin_attribute {
    struct attribute    attr;
    unsigned int        size;
    void            *private;
};

struct attribute_group {
    const char      *name;
    struct attribute    **attrs;
    struct bin_attribute    **bin_attrs;
};

struct attribute first_attr = {
    .name = "FIRST"
}; 

struct attribute second_attr = {
    .name = "SECOND"
};

struct bin_attribute first = {
    .attr = first_attr
} ;

struct bin_attribute second = {
    .attr = second_attr
}; 

struct bin_attribute *first_bin_attrs = &first;
struct bin_attribute *second_bin_attrs = &second;

struct bin_attribute *my_bin_attrs[] = { &first_bin_attrs, &second_bin_attrs };

int main(void)
{
    struct attribute_group my_group = {
        .name = "xyz",
        .bin_attrs = my_bin_attrs,
    };

    return 0;
}

您不能在文件作用域初始化程序中將變量的值用作初始化程序。

你有:

struct attribute first_attr = {
    .name = "FIRST"
}; 

…

struct bin_attribute first = {
    .attr = first_attr
};

第二個原因是生成“非常數初始化程序”錯誤,因為它試圖使用表達式first_attr ,該表達式不是編譯時常量。 您可能會在C ++中擺脫它; 你不能用C語言

您可以使用變量的地址。 計為編譯時常量(在鏈接時解析),但不計為變量的值。 在函數內部,您也可以。

重新設計struct bin_attribute ,使attr成員成為一個指針,或者放棄顯示的初始化。

第二組錯誤是由於:

struct bin_attribute *first_bin_attrs = &first;
struct bin_attribute *second_bin_attrs = &second;

struct bin_attribute *my_bin_attrs[] = { &first_bin_attrs, &second_bin_attrs };

&first_bin_attrs的類型為struct bin_attribute ** ,因此初始化值中的指針級別太多。 如果刪除& ,則類型是正確的,但是您又回到了“非常數初始化器”問題。 如果在my_bin_attrs類型中添加* ,則有成為三星級程序員的危險,並且必須修改使用my_bin_attrs的代碼。

簡單的解決方法是:

struct bin_attribute *first_bin_attrs = &first;
struct bin_attribute *second_bin_attrs = &second;

struct bin_attribute *my_bin_attrs[] = { &first, &second };

但是,是否令人滿意取決於您要實現的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM