[N… M] trong bộ khởi tạo tổng hợp C có nghĩa là gì?


101

Từ sys.c dòng 123:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tablelà một con trỏ chung đến các mảng, tôi có thể thấy điều đó. Tuy nhiên ký hiệu là gì:

[0 ... __NR_syscalls-1]

...gì?


CHỈNH SỬA:
Tôi đã học được một mẹo C khác ở đây: #include <asm/unistd.h>sẽ được xử lý trước và thay thế bằng nội dung của nó và được gán cho [0 ... _NR_syscalls-1].


2
Không, nó không phải là một con trỏ tới một mảng, nó là một mảng của con trỏ. Một con trỏ đến một mảng sẽ được công bốvoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter

@tristopia bạn nói đúng. Ý tôi là con trỏ tới các mảng, tương tự như char *argv[]. Đã sửa.
Amumu

Câu trả lời:


90

Nó đang khởi tạo bằng cách sử dụng Bộ khởi tạo được chỉ định .

Khởi tạo dựa trên phạm vi là một phần mở rộng gnu gcc.

Để khởi tạo một dải 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. Ví dụ,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Nó không phải là di động. Biên dịch với-pedantic cho bạn biết như vậy.

Làm thế nào nó hoạt động ở đây?
Bộ tiền xử lý thay thế #include <asm/unistd.h>bằng nội dung thực tế của nó ( nó định nghĩa các hằng số và kiểu ký hiệu khác, đồng thời khai báo các hàm khác ) trong cấu trúc dựa trên phạm vi, sau đó được sử dụng thêm để khởi tạo mảng con trỏ.


Có vẻ như đây không phải là di động. Là?
Ivaylo Strandjev

5
@Mehrdad trình biên dịch microsoft c có tuân theo tiêu chuẩn c99 không? Tôi đặt trường hợp của mình ở đây ... c99
Aftnix

3
@Mehrdad: Trên thực tế, chỉ có cấu trúc dựa trên phạm vi của Bộ khởi tạo được chỉ định là một phần mở rộng gcc. Bản thân các Bộ khởi tạo được chỉ định được cho phép theo tiêu chuẩn C.
Alok Save

2
@Mehrdad: Xin lỗi, tôi không muốn tham gia vào bất kỳ mồi lửa nào, ý định của tôi chỉ là làm rõ một chi tiết nhỏ mà tôi nghĩ bạn đã hiểu nhầm.
Alok Save

2
@Mehrdad: Để rõ ràng, phạm vi cấu tạo chỉ di động cho gcc (và các trình biên dịch triển khai các phần mở rộng của nó) và các trình khởi tạo được chỉ định nói chung chỉ có thể di động đối với các trình biên dịch hỗ trợ C99 (hoặc ít nhất là tính năng cụ thể đó).
Keith Thompson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.