2012-03-29 24 views
6
55 typedef struct pidmap { 
56   atomic_t nr_free; 
57   void *page; 
58 } pidmap_t; 
59 
60 static pidmap_t pidmap_array[PIDMAP_ENTRIES] = 
61   { [ 0 ... PIDMAP_ENTRIES-1 ] = { ATOMIC_INIT(BITS_PER_PAGE), NULL } }; 

Đoạn mã trên cho thấy khởi tạo một mảng cấu trúc mà tôi tìm thấy trong nguồn hạt nhân Linux. Tôi chưa bao giờ thấy hình thức khởi tạo này trước đây và tôi không thể mô phỏng cùng một thứ theo cách riêng của mình. Tôi thực sự thiếu gì?Không bao giờ được thấy trước phương pháp khởi tạo C của một mảng các cấu trúc được tìm thấy trong mã nguồn hạt nhân Linux

Source of the code

+3

Tại sao một thẻ C++? Hạt nhân Linux không sử dụng C++. – ThiefMaster

+0

Phải là một tính năng mở rộng. – iammilind

+0

Nhân Linux sử dụng nhiều phần mở rộng cụ thể của GCC. Xem ví dụ http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/index.html#toc_C-Extensions –

Trả lời

6

Đây là phần mở rộng GNU/GCC có tên là Trình khởi tạo được chỉ định. Bạn có thể tìm thêm thông tin về nó trong GCC documentation.

Để khởi tạo một loạt các phần tử có cùng giá trị, hãy viết [first ... last] = value. Đây là một phần mở rộng GNU

+2

Chỉ cần chính xác, trình khởi tạo được chỉ định không phải là phần mở rộng GCC ([xem câu hỏi này ] (http://stackoverflow.com/questions/9849719/what-do-square-brackets-mean-in-array-initialization-in-c)), nhưng cú pháp phạm vi là. – huon

5

Nó được thực hiện bằng cách sử dụng một Designated Initializer.

Đây là phần mở rộng gcc chứ không phải cấu trúc chuẩn c. Sử dụng nó kết quả trong mã không di động, Vì vậy, tránh sử dụng phần mở rộng trình biên dịch như vậy, trừ khi tính di động là ít nhất của mối quan tâm của bạn.

Các vấn đề liên quan