2011-02-04 30 views
12

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 ++

+0

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. –

+0

g ++ là trình biên dịch C++. Sử dụng gcc. – bobbogo

+0

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

Trả lời

9

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ữ).

+1

điều này không còn đúng trong g ++ - 5.2 và có lẽ sẽ quay trở lại ít nhất là g ++ - 4.8 – Catskul

+1

Vâng, câu trả lời đã được đưa ra vào năm 2012. – Tom

+2

Vâng, xin lỗi, đó có nghĩa là ghi chú cho người đọc thay vì sửa mỗi gia nhập. – Catskul

8

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 ++?

+3

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

+11

Chờ cho đến khi Linus nghe về nó. –

-2

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 ++)

+3

Đó 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

+0

Có lẽ bạn không sử dụng chế độ "C" –

+0

g ++ hỗ trợ C. Hãy thử g ++ -X c –

12

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}; 
+1

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

+0

@Quentin Đã sửa ngay bây giờ. –

1

Ít nhất g ++ - 4.8, hiện tại được hỗ trợ theo mặc định.

0

Đ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ổ.

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