2010-07-05 46 views
9

Tôi có mã C++ sử dụng một số thư viện C. Các thư viện C thực hiện các cuộc gọi lại ngôn ngữ C. Tôi đã viết một cuộc gọi lại trong mã C + + của tôi và bây giờ tôi bằng cách nào đó cần phải báo cáo lỗi từ nó (nhưng nó trả về void). Tôi tự hỏi nếu tôi có thể ném một ngoại lệ từ một cuộc gọi lại C được sử dụng từ mã C++?Tôi có thể ném ngoại lệ C++ từ cuộc gọi lại C cũ không?

Điều này rất khó hiểu đối với tôi.

Cảm ơn, Boda Cydo.

Trả lời

9

Có, bạn sẽ có thể làm như vậy. Tuy nhiên, hãy nhớ rằng hoàn toàn có khả năng thư viện C không được viết là ngoại lệ an toàn, và kết quả là bạn có thể để lại một số cấu trúc của thư viện đó trong một số trạng thái không nhất quán. Nó phụ thuộc hoàn toàn vào thư viện cụ thể và chức năng gọi lại cụ thể. Nếu không có gì khác, thư viện đó có lẽ sẽ phải được viết với sự hỗ trợ C++ từ đầu khi liên quan đến việc gọi lại đó.

+1

+1 điểm tốt, thư viện C có thể cấp phát bộ nhớ, mở tệp hoặc kết nối mạng trước khi gọi hàm gọi lại. Nếu bạn ném một ngoại lệ ở đó, thư viện không rõ ràng sau đó. – Ozan

+0

Cảm ơn lời khuyên. Tôi đã làm cho nó sử dụng một biến toàn cầu được thiết lập nếu xảy ra lỗi. Tất cả các cuộc gọi tiếp theo với hàm gọi lại C này sau đó chỉ trả lại và không làm gì cả. Sau khi thư viện được thực hiện với tất cả các cuộc gọi C và tôi quay trở lại mã C++ của mình, tôi kiểm tra xem biến toàn cục này đã được đặt chưa, và nếu có, tôi báo cáo lỗi. – bodacydo

+2

Hai câu lệnh đầu tiên của bạn có mâu thuẫn lẫn nhau. "Có, bạn sẽ có thể làm như vậy." - Được rồi, tốt lắm. "Tuy nhiên, hãy nhớ rằng hoàn toàn có khả năng là thư viện C không được viết là ngoại lệ an toàn," - Ồ, vậy nên câu trả lời thực sự là không. Không bao giờ ném ngoại lệ qua mã không được biết là ngoại lệ an toàn. – JeremyP

1

Có, bạn có thể ném ngoại lệ từ hàm C++ của mình. Tuy nhiên, nó chỉ có thể bị bắt bởi mã C++ vì vậy nó sẽ không được xử lý trong thư viện kế thừa.

+0

Ý của bạn là nói "từ hàm C"? – egrunin

+0

No. Nếu bạn ném một ngoại lệ, thì chức năng không phải là C, phải không? – Anthony

+0

Điểm tốt. Là nó C gọi lại sau đó hoặc gọi lại C++ nếu tôi ném từ nó? – bodacydo

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