我正在尝试更多地了解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;
}
答案 0 :(得分: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
,则可能会成为Three Star Programmer,并且您必须修改使用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 };
但这是否令人满意取决于你想要达到的目标。