gpt4 book ai didi

c - 指定初始化器 : GCC warning message: near initialization and other warning messages

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:19 30 4
gpt4 key购买 nike

我正在尝试了解更多关于 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 的类型,您就有成为 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 };

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

关于c - 指定初始化器 : GCC warning message: near initialization and other warning messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22745793/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com