Dấu ngoặc vuông có nghĩa là gì trong khởi tạo mảng trong C?


85
static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

Ý nghĩa của [0x3A]ở đây là gì? Tôi chỉ học được những câu nhưint a[2] = {1, 2};


Nhiều khả năng đó là một tiện ích mở rộng trình biên dịch cho phép bạn khởi tạo các mục nhập mảng cụ thể (tại các chỉ số nhất định) và điền vào phần còn lại.
Alexey Frunze

Câu trả lời:


81

Nó có nghĩa là khởi tạo phần tử thứ n của mảng. Ví dụ bạn đã đưa ra sẽ có nghĩa là:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

Chúng được gọi là "bộ khởi tạo được chỉ định" và thực sự là một phần của tiêu chuẩn C99. Tuy nhiên, cú pháp không có =thì không. Từ trang đó:

Một cú pháp thay thế cho điều này đã lỗi thời kể từ GCC 2.5 nhưng GCC vẫn chấp nhận là viết [index]trước giá trị phần tử, với không =.


41

Theo tài liệu GCC, đây là tiêu chuẩn ISO C99. Họ gọi nó là "Bộ khởi tạo được chỉ định":

Để chỉ định một chỉ số mảng, hãy viết `[index] = 'trước giá trị phần tử. Ví dụ,

 int a[6] = { [4] = 29, [2] = 15 };

tương đương với

 int a[6] = { 0, 0, 15, 0, 29, 0 };

Tôi chưa bao giờ thấy cú pháp này trước đây, nhưng tôi chỉ biên dịch nó với gcc 4.4.5, với -Wall. Nó được biên dịch thành công và không đưa ra cảnh báo.

Như bạn có thể thấy từ ví dụ đó, nó cho phép bạn khởi tạo các phần tử mảng cụ thể, để các phần tử khác không bị ảnh hưởng.


15

Điều đó đã được giới thiệu trong C99 và nó được gọi là bộ khởi tạo được chỉ định .

Về cơ bản, nó cho phép bạn đặt các giá trị cụ thể trong một mảng với phần còn lại được để làm giá trị mặc định.

Trong trường hợp cụ thể này, các chỉ mục mảng là mã quét bàn phím. 0x3amã quét trong tập số 1 (xem phần 10.6) cho CapsLockkhóa, 0x45NumLockvà 0x46 là ScrollLock.

Trên liên kết đầu tiên ở trên, nó nói rằng:

int a[6] = { [4] = 29, [2] = 15 };

tương đương với:

int a[6] = { 0, 0, 15, 0, 29, 0 };

Điều thú vị là, mặc dù liên kết nói rằng =cần thiết, nhưng điều đó dường như không đúng ở đây.


13

Nó (gần với) cú pháp của các trình khởi tạo được chỉ định , một tính năng C99.

Về cơ bản, nó khởi tạo các phần của một mảng, chẳng hạn;

int aa[4] = { [2] = 3, [1] = 6 };

Tăng giá trị thứ hai của mảng thành 6 và giá trị thứ ba thành 3.

Trong trường hợp của bạn, các hiệu số mảng xảy ra ở dạng hex (0x3a) khởi tạo phần tử thứ 58 của mảng thành giá trị CAPSLOCK mà có lẽ được xác định trong mã phía trên mã bạn đang hiển thị.

Phiên bản trong mã của bạn không =có phần mở rộng có vẻ là một phần mở rộng cụ thể cho gcc.

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.