c - 指定的初始值设定项:GCC 警告消息:接近初始化和其他警告消息



我正在尝试了解有关 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 };

但这是否令人满意取决于你想要实现的目标。

最新更新