Thành viên mảng linh hoạt là tính năng tiêu chuẩn của C, bắt đầu với tiêu chuẩn 1999. Chúng không tồn tại trong C++.
Mã của bạn không hợp lệ C++. Gói nó trong extern "C"
không thay đổi điều đó. Trình biên dịch C++ phù hợp phải ít nhất là cảnh báo về nó và được cho là nên từ chối nó.
Điều đó xảy ra khi g ++ triển khai thành viên mảng linh hoạt kiểu C dưới dạng phần mở rộng cho C++. Điều đó hoàn toàn hợp pháp (các trình biên dịch được phép thực hiện các phần mở rộng), nhưng việc sử dụng nó không phải là di động. Hành vi của nó, giống như của bất kỳ phần mở rộng ngôn ngữ nào, được định nghĩa bởi trình biên dịch, không phải bởi ngôn ngữ.
Nếu bạn biên dịch nó với g++ -pedantic
, bạn sẽ nhận được một cảnh báo:
c.cpp:5:21: warning: ISO C++ forbids zero-size array ‘buf’ [-Wpedantic]
char buf[];
^
Nếu bạn muốn sử dụng C-phong cách thành viên mảng linh hoạt trong một chương trình C++ mà không dựa vào một phần mở rộng trình biên dịch cụ thể, bạn có thể biên dịch mã C của bạn thành C và liên kết nó với chương trình C++ của bạn. Bạn không thể tạo kiểu với thành phần mảng linh hoạt hiển thị cho mã C++ của bạn, nhưng bạn có thể sử dụng nó trong nội bộ mã C, và có thể cung cấp truy cập vào nó trong mã C++ của bạn thông qua một con trỏ đục. Xem the C++ FAQ để biết thông tin về trộn C và C++ trong cùng một chương trình. (Hoặc bạn chỉ có thể sử dụng phần mở rộng g ++, với chi phí không thể biên dịch mã của bạn với các trình biên dịch khác.)
(Tôi giả định rằng bạn đang sử dụng g ++).)
Nguồn
2015-08-07 15:53:16
Xem bên dưới, nhưng FAM thường biên dịch chính xác trong C++. – Jason
Lưu ý: Vì 'get_buf() make_struct()' chỉ sử dụng một con trỏ tới 'struct x', tại sao' struct x' được định nghĩa trong 'blah.h'? – chux
Tôi đang chuyển câu hỏi này về phiên bản trước. Nếu bạn có câu hỏi mới, bạn có thể yêu cầu [ask] (http://stackoverflow.com/questions/ask), nhưng chỉnh sửa cuối cùng của bạn dường như là một nỗ lực để vô hiệu tất cả các câu trả lời bạn nhận được. –