nguồn kernel Linux có rất nhiều literals mảng như thế này:chỉ mục rõ ràng trong các mảng chữ C?
enum {
FOO,
BAR
};
static const char* const names[] = {
[FOO] = "foo", /* wtf is this? */
[BAR] = "bar",
};
Ở đây mỗi dòng chỉ ra một cách rõ ràng các chỉ số trong mảng các giá trị cung cấp thay vì dựa vào trật tự.
Tôi không biết cụm từ cần tìm kiếm - điều này được gọi là gì? Tiêu chuẩn nào định nghĩa nó? (Hoặc nó là một phần mở rộng GNU?) Tôi có thể làm điều này trong C + + hoặc chỉ đơn giản C? Thử nghiệm với gcc
, tôi tìm thấy với trên trong test.c
,
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
các lệnh này trở thành công:
$ gcc -Wall -c test.c
$ gcc -Wall -c --std=c90 test.c
$ gcc -Wall -c --std=gnu90 test.c
$ gcc -Wall -c --std=iso9899:1990 test.c
$ gcc -Wall -c --std=c1x test.c
và các lệnh này thất bại với khiếu nại khác nhau về lambdas và operator=
:
$ g++ -Wall -c test.c
$ g++ -Wall -c --std=c++98 test.c
$ g++ -Wall -c --std=gnu++98 test.c
$ g++ -Wall -c --std=c++0x test.c
$ g++ -Wall -c --std=gnu++0x test.c
Điều đó cho thấy điều này là hợp lệ C (chỉ là về bất kỳ phương ngữ) nhưng không C + +. Nhưng tôi hoài nghi. Tôi không nhớ việc nhìn thấy điều này được sử dụng ở bất cứ đâu, nhưng nhân Linux. Tôi cũng không thấy nó được mô tả trong, ví dụ, this list of constructs valid in C but not C++.
Nếu bạn thêm '-pedantic' vào các dòng trình biên dịch của mình, bạn sẽ thấy rằng nó đã được thêm vào C99. – caf
Cảm ơn mọi người! –