Tôi có kịch bản sau:Trộn các tiêu chuẩn C++ khác nhau với GCC
Có hai thành phần được viết bằng C++ 11 trong C++ 98. Cả hai đều được biên dịch từ đầu bằng cách sử dụng cùng một GCC 4.9. Một sử dụng mặc định ẩn --std=gnu++98
một cách rõ ràng khác đặt --std=c++11
.
Ngay cả sau khi thực hiện một số nghiên cứu, tôi không thể trả lời hoàn toàn câu hỏi nếu điều này có thể gây ra sự cố.
Các GCC wiki nói:
Ngôn ngữ C++ 98 là ABI-tương thích với ngôn ngữ C++ 11, nhưng một số nơi trong khả năng tương thích nghỉ ngơi thư viện. Điều này làm cho nó nguy hiểm khi liên kết các đối tượng C++ 98 với các đối tượng C++ 11. Nếu bạn có thể biên dịch lại mã của bạn trong các phiên bản phù hợp của ngôn ngữ, bạn nên làm điều đó.
Điều này cho thấy sự cố được mong đợi.
Vì vậy, câu hỏi là:
Có những vấn đề nếu hai thành phần xây dựng với
--std=gnu++98
và--std=c++11
được liên kết với nhau, thậm chí khó khăn họ sử dụng cùnglibstdc++
và được xây dựng với trình biên dịch cùng (GCC 4.9)?Có Dual ABI mẫu hỗ trợ GCC 5.1 có ảnh hưởng trong trường hợp đó không?
Tôi khuyên bạn chỉ nên xây dựng cả hai bằng '-std = C++ 11' (hoặc phương ngữ GNU). –
Đó sẽ là lý tưởng, nhưng trong trường hợp này việc biên dịch thành phần đầu tiên không biên dịch được khi được xây dựng với một cái gì đó mới hơn thì C++ 98 và thay đổi nó là không thể ngay bây giờ. – Pascal
'std :: string' được sử dụng? Thứ hai, những thay đổi đột phá đó, có lẽ bạn nên sợ hãi về chúng: nhiều sự phá vỡ có thể là lỗi thực sự. – Yakk