Tôi đang cố gắng tìm hiểu thêm về kobjects trong nhân linux và trong khi cố gắng viết một mô-đun sử dụng công cụ như vậy, tôi nhận được thông báo lỗi và cảnh báo, vì vậy tôi đã đặt một phiên bản cô đọng của dữ liệu liên quan vào đây cấu trúc và các thông báo cảnh báo và lỗi gcc tương ứng.
$ gcc issue.c
issue.c:30:1: error: phần tử khởi tạo không cố định
} ;
^
issue.c:30:1: error: (gần khởi tạo cho 'first.attr')
issue.c:34:1: error: phần tử khởi tạo không cố định
};
^
issue.c:34:1: error: (gần khởi tạo cho 'second.attr')
issue.c:39:8: cảnh báo: khởi tạo từ loại con trỏ không tương thích [được bật theo mặc định]
struct bin_attribute *my_bin_attrs[] = { &first_bin_attrs, &second_bin_attrs };
^
issue.c:39:8: cảnh báo: (gần khởi tạo cho 'my_bin_attrs[0]') [được bật theo mặc định]
issue.c:39:8: cảnh báo: khởi tạo từ loại con trỏ không tương thích [được bật theo mặc định]
issue.c:39:8: cảnh báo: (gần khởi tạo cho 'my_bin_attrs[1]') [được bật theo mặc định]
và mã mẫu:
#include
thuộc tính cấu trúc {
const char *tên;
chế độ ngắn không dấu;
};
cấu trúc bin_attribute {
thuộc tính cấu trúc attr;
kích thước int không dấu;
void *riêng tư;
};
cấu trúc thuộc tính_group {
const char *tên;
thuộc tính cấu trúc **attrs;
struct bin_attribute **bin_attrs;
};
thuộc tính cấu trúc first_attr = {
.name = "ĐẦU TIÊN"
};
thuộc tính cấu trúc thứ hai_attr = {
.name = "THỨ HAI"
};
struct bin_attribute đầu tiên = {
.attr = first_attr
} ;
struct bin_attribute giây = {
.attr = giây_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;
}
Bạn không thể sử dụng giá trị của biến làm công cụ khởi tạo trong trình khởi tạo phạm vi tệp.
Bạn có:
thuộc tính cấu trúc first_attr = {
.name = "ĐẦU TIÊN"
};
…
struct bin_attribute đầu tiên = {
.attr = first_attr
};
Thứ hai là tạo ra lỗi "trình khởi tạo không phải hằng" vì nó cố gắng sử dụng một biểu thức đầu tiên_attr
, đây không phải là hằng số thời gian biên dịch. Bạn có thể thoát khỏi nó trong C++ nhưng không thể trong C.
Bạn có thể sử dụng địa chỉ của một biến; giá trị này được tính là hằng số thời gian biên dịch (được giải quyết tại thời điểm liên kết), chứ không phải giá trị của biến. Bên trong một chức năng bạn cũng có thể.
hoặc thiết kế lại cấu trúc bin_attribute
,làm attr
Thành viên trở thành một con trỏ hoặc việc khởi tạo rõ ràng của bạn sẽ bị loại bỏ.
Nhóm lỗi thứ hai là do:
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
Loại làcấu trúc bin_attribute **
, do đó có thêm một lớp con trỏ trong giá trị khởi tạo. Nếu bạn xóa &
, các loại đều đúng, nhưng bạn quay lại vấn đề "trình khởi tạo không phải const". Nếu bạn muốn *
添加到 my_bin_attrs
gõ, bạn trở thành Lập trình viên ba sao sự nguy hiểm. và bạn phải sửa đổi nó bằng cách sử dụng my_bin_attrs
mã số.
Cách khắc phục đơn giản là:
struct bin_attribute *first_bin_attrs = &first;
struct bin_attribute *second_bin_attrs = &second;
struct bin_attribute *my_bin_attrs[] = { &first, &second };
Nhưng liệu điều này có thỏa đáng hay không còn phụ thuộc vào những gì bạn muốn đạt được.
Tôi là một lập trình viên xuất sắc, rất giỏi!