2016-06-27 15 views
5

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à:

  1. Có những vấn đề nếu hai thành phần xây dựng với --std=gnu++98--std=c++11 được liên kết với nhau, thậm chí khó khăn họ sử dụng cùng libstdc++ và được xây dựng với trình biên dịch cùng (GCC 4.9)?

  2. Dual ABI mẫu hỗ trợ GCC 5.1 có ảnh hưởng trong trường hợp đó không?

+0

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

+0

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

+0

'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

Trả lời

0

1) Có thể có vấn đề, ví dụ: việc triển khai một số phần của lib bạn đã đề cập thay đổi.

2) Có.

Tôi sẽ biên dịch lại mọi thứ trong một trong hai phiên bản C++. Nếu đó không phải là một lựa chọn (thư viện của bên thứ ba, vv) sử dụng cơ chế ABI kép có thể là một giải pháp. Hãy rất cẩn thận về những gì nó được chia sẻ giữa các phiên bản mã khác nhau.

Phần wiki bạn đã đề cập đến các cuộc trò chuyện về các tình huống ở đó, ví dụ, mã cũ cố gắng thực hiện các công cụ không còn được hỗ trợ (cú pháp ngữ nghĩa nhưng khác nhau).

+0

Về câu trả lời 1) Bạn có nghĩa là vấn đề là giao diện của 'libstdC++' thay đổi giữa C++ 98 và C++ 11 thay đổi. Hoặc là nó chỉ là họ có thể hành xử hơi khác nhau và lỗi có thể phát sinh vì điều đó? Trong trường hợp thứ hai, điều này sẽ không xảy ra nếu mã đúng theo tiêu chuẩn C++ phải không? – Pascal

+0

Cả hai. Vì bạn sử dụng GCC 4.9, bạn có thể không gặp bất kỳ vấn đề nào về loại đó (bạn sẽ sử dụng việc triển khai libstdC++ cũ), những gì bạn phải cẩn thận là các thư viện khác mà bạn không biết phụ thuộc. Trong libstdC++ bạn may mắn vì những thay đổi được gạch chân với vùng tên và trình liên kết sẽ cảnh báo bạn nếu có vấn đề về loại này.Điều này có thể xảy ra hoặc có thể không xảy ra với các thư viện khác (ví dụ như tăng cường thể hiện rủi ro cao là bị đau trong loại tình huống này). – Robbykk

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