2011-11-03 45 views
7

Tôi đang thiết kế một phần mềm trung gian truyền thông để sử dụng trong một ứng dụng có mô-đun trong Ada và nhiều mô-đun trong C++, giao tiếp các tham số truyền (giá trị vô hướng) và cấu trúc. Ứng dụng chạy trong MS Windows XP và Windows 7, phần C++ đang được phát triển trong MSVC++ 2008, phần Ada đang được phát triển bằng cách sử dụng GPS/GNAT. Phiên bản Ada là 1995 nhưng chúng tôi đang ở giữa quá trình di chuyển trình biên dịch (phiên bản mới hơn của GPS/GNAT) với khả năng sử dụng thông số Ada mới hơn.Bản ghi biến thể Ada có thể tương thích nhị phân với liên minh C++ không?

Phần giữa được viết bằng C++ và tôi muốn sử dụng loại công đoàn có chứa tất cả các loại được chuyển giữa các mô-đun, vì vậy tôi sẽ không cần chỉ định một hàm nạp/nhận cho từng loại được sử dụng trên hệ thống .

Câu hỏi đặt ra là, các công thức nhị phân C++ có tương thích với các bản ghi biến thể Ada không? Nói cách khác, nếu tôi vượt qua một liên minh C + + để mã Ada nó sẽ có thể đọc nó như là một bản ghi biến thể? (Và ngược lại)

Tôi nghĩ rằng điều này là có thể một số điều chỉnh sẽ là cần thiết ... (Eg .: C++ đoàn không chứa một thành viên trong đó mô tả nội dung của nó trong khi bản ghi Ada biến làm)

+1

Bạn có thể sẽ cần phải xác định nền tảng, trình biên dịch, vv –

+0

Cảm ơn, chỉ cần thêm thông tin về môi trường của chúng tôi. – Guarita

Trả lời

2

Không. Khi bạn tự tuyên bố, bản ghi biến thể Ada chứa trường thẻ. Công đoàn C không có điều đó. (Ít nhất không phải trong MSVC++ và GCC - nó được ISO C. cho phép)

+0

Ahm, vâng, nhưng câu hỏi của tôi là nếu có thể làm cho các công đoàn C tương thích với các biến thể của Ada với một số công việc bổ sung không phải là plug-n-play. Tôi đã dự kiến ​​sẽ có một số rắc rối để thích ứng với phần C để nói chuyện nhị phân với mã Ada. – Guarita

7

Có thể.

Ada 2005 cung cấp Unchecked_Union pragma cho phép chương trình "[chỉ định] một giao tiếp tương ứng giữa một loại phân biệt đối xử đã cho và một số công đoàn C. Pragma quy định rằng loại liên kết sẽ được biểu diễn để không có khoảng trống cho (các) phân biệt đối xử. "

Từ đọc phần RM của tôi, một tuyên bố một loại Ada với (các) phân biệt cần thiết để xác định một bản ghi biến thể, nhưng không có không gian lưu trữ được phân bổ cho (các) phân biệt đối xử. Tôi lấy nó có nghĩa là ở phía Ada rằng sự phân biệt đối xử không thể được tham chiếu sau đó. (Cũng có những hạn chế khác, giống như tất cả các trường phải tương thích với C, xem RM B.3.3 để biết thêm thông tin.)

Tôi chưa bao giờ sử dụng pragma này, và tôi không thể không nghĩ rằng nó sẽ yêu cầu một số thử nghiệm để làm cho nó (hy vọng) làm việc với hệ thống của bạn. Chúc may mắn!

+2

Một số thử nghiệm sẽ là để tìm hiểu xem bạn có cần phải nói với GNAT để đặt các hồ sơ ra theo cách MSVC++ mong đợi, và nếu như vậy làm thế nào. GNAT hiểu các quy ước của GCC, tất nhiên; miễn là bạn giới hạn bản thân đối với các công đoàn C và các loại đơn giản, nó không quá tệ. –

+1

GCC trên Windows phù hợp với nền tảng C ABI, do đó GNAT trên Windows phải là ABI tương thích với MSVC++. – MSalters

3

Như MSalters đã đề cập, nó sẽ không hoạt động trừ khi công đoàn C vì một lý do nào đó chứa trường chỉ định biến thể. Vì điều này là không cần thiết trong C, nó sẽ không thường xuyên làm việc. Tuy nhiên, kể từ khi bạn kiểm soát việc triển khai loại C đó, bạn có thể làm cho nó hoạt động. Chỉ cần chắc chắn có một lĩnh vực ngay trước khi liên minh chỉ định công đoàn nào đang được sử dụng.

Để làm cho nó hoàn toàn tương thích nhị phân với cấu trúc công đoàn C, bạn có thể cần phải đi với một loại bản ghi Ada đơn giản, cùng với mệnh đề biểu diễn bản ghi để đảm bảo các trường được đặt trong cùng một vị trí trình biên dịch C của bạn xảy ra để đặt chúng. Và có, điều đó không để bạn dễ bị thay đổi trình biên dịch C gây ra thay đổi bố cục. Bạn có thể cố gắng bảo vệ chống lại điều đó với bitfields trong mã C của bạn, nhưng chúng không đủ mạnh để thực sự đặt mọi thứ ra khỏi cách mà các mệnh đề đại diện của bản ghi Ada có thể. Đó là một trong những lý do chúng tôi muốn sử dụng Ada cho công việc cấp thấp.

Tôi nên đề cập rằng, khi cuối cùng tôi đã kiểm tra, phiên bản Windows của Gnat không tương thích với trình liên kết với các tệp nhị phân của VisualStudio. Cách duy nhất tôi biết để có được hai trình biên dịch để làm việc cùng nhau là đặt toàn bộ giao diện trong một DLL. Nếu không, bạn có thể sẽ cần sử dụng GCC để xây dựng hệ thống C++ của bạn, hoặc sử dụng một số trình biên dịch Ada khác, như ObjectAda.

+0

"Như MSalters đã đề cập, nó sẽ không hoạt động trừ khi công đoàn C vì một lý do nào đó có chứa một trường chỉ định biến thể." Có lẽ tôi có thể làm điều này với cấu trúc như: struct foo { thẻ some_tag_type; công đoàn { ... } my_union; } ?? – Guarita

+0

@guarita xem câu trả lời của tôi cho một liên kết hữu ích - tôi nghĩ bạn đang đi đúng hướng với ý tưởng này. – NWS

+0

Có. Như @NWS đã nói, bạn đang đi đúng hướng. –

5

Có.

Ada tương thích với C/C++ Unions. Xem here để biết cách thực hiện (pdf) Cụ thể Trang 5 cho thấy cách thực hiện với Unions & Thẻ. Nó sẽ giống nhau khi sử dụng các hồ sơ kỳ thị. (Caveat: nó có lẽ không phải là trình biên dịch bạn đang sử dụng, nhưng tôi sẽ rất ngạc nhiên nếu bạn không hoạt động theo cùng một cách!)

+1

Tôi nghĩ bạn có chút lạc quan về kỳ vọng rằng người ta có thể mong đợi các trình biên dịch Ada/C/C++ khác nhau để xử lý vấn đề này mà không có mối quan tâm lớn, nhưng nó là một hướng dẫn hữu ích cho vấn đề. –

+0

@Marc Sự lạc quan của tôi dựa trên thực tế là các trình biên dịch Ada nên được xác nhận, vì vậy chúng có thể làm được những điều tương tự (thậm chí nếu không tốt bằng nhau!) – NWS

+0

Nó không phải là khía cạnh Ada mà tôi quan tâm. bố trí và liên kết minutia giữa các trình biên dịch khác nhau mà màu sắc tôi hoài nghi (của lạc quan :-). Tôi không xa lạ gì với các ràng buộc, thậm chí việc chia sẻ cấu trúc dữ liệu giữa GNAT và gcc đòi hỏi sự quan tâm. –

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