Tôi biết rằng trong nguyên tắc này có lẽ là hành vi không xác định, nhưng vì lợi ích của đối phó với một dự án lớn, đây là câu hỏi của tôi về GCC:Các phương ngữ GCC khác nhau có thể được liên kết với nhau không?
Giả sử tôi lập một đơn vị transation với gcc -std=c++98
, và khác với -std=c++11
, sử dụng chính xác cùng một trình biên dịch cài đặt. Có bất kỳ loại bảo đảm nào mà tôi có thể liên kết hai tệp đối tượng và có được một chương trình được xác định rõ không? Theo như tôi có thể nói, các vấn đề tiềm năng chỉ có thể đến từ các góc nhìn khác nhau của các tiêu đề thư viện do các macro khác nhau, và những thứ đó sẽ tốt nhất là thêm chức năng thành viên mới, nhưng không bao giờ là đối tượng thành viên các lớp thư viện chuẩn.
Điều này có giúp cho việc biên dịch các phần khác nhau của một dự án lớn hơn với các phương ngữ ngôn ngữ khác nhau có chấp nhận được không?
Cập nhật: tôi nên thêm một câu hỏi trực giao: Điều gì về việc sử dụng hai phiên bản khác nhau của GCC (nói 4.3 và 4.6), nhưng Wht tùy chọn phương ngữ cùng (-std=c++98
)? Danh sách in this GCC documentation dường như gợi ý rằng thư viện tương thích theo cả hai hướng giữa 4.2.2 và 4.6.
"người ta khó có thể mong đợi các thư viện chuẩn đã được biên soạn với các biểu tượng tiền xử lý được sử dụng trong dự án của bạn" - và ngay cả khi nó đã được, và giả sử trong một khoảnh khắc mà vĩ mô 'MYPROG_CONFIG_FILE_LOCATION' được sử dụng trong' memset.c', nghĩa là định nghĩa 'memset.c' hoàn toàn không liên quan đến ý nghĩa của nó trong chương trình của bạn. Vì vậy, nếu biên dịch 'memset.c' có/không có' MYPROG_CONFIG_FILE_LOCATION' tạo sự khác biệt cho khả năng tương thích nhị phân, thì nó sẽ làm như vậy độc lập cho dù chương trình của bạn có xảy ra cũng sử dụng 'MYPROG_CONFIG_FILE_LOCATION' hay không. –
@SteveJessop Có. Ngay cả khi nó đã được, nó phải được minh bạch cho bạn. Trong thực tế, tất cả các ký hiệu tiền xử lý trong không gian tên của bạn (tức là không bắt đầu bằng dấu gạch dưới và không chứa hai dấu gạch dưới liền kề) _should_ an toàn. Các ký hiệu tiền xử lý trong không gian tên triển khai, như '_GLIBCXX_DEBUG', sẽ không được. –