Có lý do cụ thể nào để hỗ trợ các trình khởi tạo được chỉ định không được thêm vào g ++ không? Lý do mà chuẩn C99 đến trễ và g ++ được phát triển trước đó và sau đó mọi người không quan tâm đến vấn đề này, hoặc có một số khó khăn cố hữu trong việc triển khai các trình khởi tạo được chỉ định trong ngữ pháp của C++?Tại sao các trình khởi tạo được chỉ định không được triển khai trong g ++
Trả lời
Như tôi đã lưu ý trong một nhận xét, G ++ không hỗ trợ các trình khởi tạo được chỉ định chuẩn C99, nhưng nó hỗ trợ phần mở rộng GNU cho C90 cho phép khởi tạo được chỉ định. Vì vậy, điều này không làm việc:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Nhưng điều này không:
union value_t my_val = { v_f: 3.5f };
này có vẻ là một sự tương tác xấu của sự phối hợp giữa các ủy ban tiêu chuẩn C và C++ (không có lý do đặc biệt tốt tại sao C++ không hỗ trợ cú pháp C99, họ chỉ không xem xét nó) và chính trị GCC (C++ không hỗ trợ cú pháp C99 chỉ vì nó ở C99, nhưng cần hỗ trợ cú pháp mở rộng GNU để đạt được chính xác điều tương tự vì đó là một phần mở rộng GNU có thể được áp dụng cho một trong hai ngôn ngữ).
C++ không hỗ trợ điều này. Nó thậm chí sẽ không nằm trong tiêu chuẩn C++ 0x, có vẻ như: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
Ngoài ra, tại sao bạn đang cố biên dịch hạt nhân Linux bằng G ++?
Chúng tôi đã viết lại một số phần của hạt nhân Linux trong C++, vì vậy nó là điều cần thiết cho chúng tôi sử dụng g + + – Bharat
Chờ cho đến khi Linus nghe về nó. –
Mã hóa thành http://gcc.gnu.org/c99status.html trình khởi tạo được chỉ định đã được triển khai.
Bạn sử dụng phiên bản g ++ nào? (Hãy dùng thử phiên bản g ++)
Đó là C99, không phải C++. Tôi không nghĩ rằng mọi tính năng C99 được hỗ trợ ngầm bởi g ++. – Maister
Có lẽ bạn không sử dụng chế độ "C" –
g ++ hỗ trợ C. Hãy thử g ++ -X c –
Tôi đã gặp phải sự cố tương tự này ngay hôm nay. g ++ với -std = C++ 11 và C++ 14 không hỗ trợ initializers được chỉ định, nhưng bạn vẫn có thể nhận được một lỗi biên dịch "test.cxx: 78: 9: xin lỗi, unimplemented: non-tầm thường được chỉ định initializers không được hỗ trợ" nếu bạn không khởi tạo cấu trúc theo thứ tự các thành viên đã được xác định. Ví dụ:
struct x
{
int a;
int b;
};
// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};
Trình khởi tạo được chỉ định vẫn không phải là một phần của bất kỳ phiên bản C++ chuẩn nào. – Quentin
@Quentin Đã sửa ngay bây giờ. –
Ít nhất g ++ - 4.8, hiện tại được hỗ trợ theo mặc định.
Điều gì về các công đoàn ẩn danh?
Trong C tôi có thể có điều này:
struct vardir_entry {
const uint16_t id;
const uint8_t sub;
const char *name;
const uint8_t type;
const union {
struct vardir_lookup lookup;
struct vardir_min_max_conf minmax;
};
const union {
const struct vardir_value_target_const const_value;
const struct vardir_value_target value;
};
};
Và khởi tạo như thế này:
static const struct vardir_entry _directory[]{
{ .id = 0xefef, .sub = 0, .name = "test", .type = VAR_UINT32, .minmax = { .min = 0, .max = 1000 }, .value = VARDIR_ENTRY_VALUE(struct obj, &obj, member) }
};
Tuy nhiên dưới g ++ ngay cả với C++ 14 này cung cấp cho các "xin lỗi, chưa thực hiện" lỗi tương tự. Chúng ta cần có khả năng định nghĩa các biến C trong C++ khi chúng ta ít nhất muốn đơn vị kiểm tra mã C với khung kiểm thử C++. Thực tế là một tính năng có giá trị như vậy từ C không được hỗ trợ khá là xấu hổ.
- 1. Tại sao các hằng số mảng chỉ được sử dụng trong các trình khởi tạo?
- 2. C++ Tương đương với Trình khởi tạo được Chỉ định?
- 3. Tại sao biểu thức khởi tạo bộ sưu tập yêu cầu IEnumerable được triển khai?
- 4. Trường chỉ đọc được khởi tạo là null, tại sao?
- 5. Cảnh báo “Sử dụng không được khởi tạo” trong trình biên dịch g ++
- 6. Tại sao tôi nhận được "không tổng hợp không thể được khởi tạo với danh sách bộ khởi tạo"
- 7. CoreData: lỗi: Không gọi được trình khởi tạo được chỉ định trên lớp NSManagedObject
- 8. Tại sao các thành viên lớp mẫu chưa được kích hoạt lại không được khởi tạo?
- 9. Tại sao chỉ mục ICollection không hoạt động khi được khởi tạo?
- 10. Tại sao trình tạo bản sao không được gọi?
- 11. Kết hợp các trình khởi tạo được chỉ định và malloc trong C99 +?
- 12. Tại sao 'được' triển khai thành 'dưới dạng'?
- 13. Tại sao các biến thành viên được khởi tạo trong các hàm tạo?
- 14. Tại sao lớp của tôi không thể triển khai giao diện được khai báo bên trong?
- 15. Tại sao ValueType.GetHashCode() được triển khai giống như vậy?
- 16. Tại sao cú pháp khởi tạo đồng bộ chỉ được áp dụng cho các đối tượng?
- 17. Điều gì sẽ xảy ra với các trường không được đặt tên bởi trình khởi tạo được chỉ định?
- 18. Tại sao gmtime được triển khai theo cách này?
- 19. Tại sao các biến mẫu được khởi tạo trước khi hàm tạo được gọi là?
- 20. Khi nào một lớp học sẽ có nhiều hơn một trình khởi tạo được chỉ định?
- 21. Tại sao zipWithIndex được triển khai trong Iterable và không Traversable?
- 22. JAXB - các lớp được tạo ra triển khai giao diện
- 23. Làm cách nào để chỉ định ngoại lệ được trình tạo bởi một người triển khai giao diện?
- 24. Tại sao chúng ta không được phép chỉ định một hàm tạo trong một giao diện?
- 25. Tại sao tôi nhận được "tham chiếu chéo cơ sở dữ liệu không được triển khai"?
- 26. Tại sao phương thức giao diện C# được triển khai trong một lớp là công khai?
- 27. Tại sao HttpServlet triển khai Serializable?
- 28. Tại sao conhost.exe được khởi chạy?
- 29. Tại sao biến ngoài của tôi chưa được khởi tạo?
- 30. Tại sao việc ghi đè loại trừu tượng đã triển khai không thể thực hiện được?
Linux được viết bằng C chứ không phải C++. g ++ là giao diện người dùng cho C++, sử dụng gcc cho C. –
g ++ là trình biên dịch C++. Sử dụng gcc. – bobbogo
Chúng tôi đã viết lại một số phần của hạt nhân Linux trong C++, vì vậy nó là điều cần thiết để chúng tôi sử dụng g ++ – Bharat