2017-09-21 20 views
7

Tôi muốn cung cấp chức năng gọi lại cho mã được viết bằng Haskell (GHC). Nó sử dụng các loại hàm GCC C-compiler giống như chức năng xuất/nhập và tương thích với thời gian chạy với mã của tôi.extern "C" cho hàm gọi lại thành viên tĩnh

tôi phải cung cấp một chức năng gọi lại, mà trên thực tế chấp nhận this con trỏ đến lớp và chỉ cần gọi phương pháp của nó:

struct C 
{ 
    int f(int i) { ; } 
    static int f_callback(void * self, int i) 
    { 
     static_cast< C * >(self)->f(i); 
    } 
}; 

Logic f_callback là một phần của lớp C, vì vậy tôi đặt nó vào tương ứng phạm vi không gian tên.

Nhưng tôi lo lắng về việc tôi có nên sử dụng đặc điểm ngôn ngữ extern "C" (gọi quy ước là vấn đề ở đây, không phải tên mangling)? Có thể khai báo và định nghĩa hàm extern "C" trong không gian tên đồng bằng, có một vài quy tắc đặc biệt cho các hàm extern "C" được định nghĩa có cùng tên trong các không gian tên khác nhau, nhưng there is không phân biệt giữa không gian tên của phạm vi lớp và không gian tên đơn giản.

Có thể xác định hàm static extern "C" thành phạm vi lớp học không?

+0

Không, không thể IIRC. Nhưng bạn không cần phải lo lắng rằng C và C++ sử dụng một khung ABI hoặc ngăn xếp khác nhau. – user0042

+0

@ user0042 Sẽ là 'tĩnh __cdecl' an toàn hơn sau đó không có gì? – Orient

+0

Đó là chú thích không di động, nhưng có bạn có thể sử dụng chú thích đó. – user0042

Trả lời

5

Cuộc gọi lại bên ngoài theo thiết kế không được liên kết với một lớp cụ thể.

Làm cho nó thành viên lớp tĩnh có lẽ là tốt đẹp theo nội bộ của mã của bạn, nhưng nó xuyên tạc thực tế.

Do đó, tôi khuyên bạn nên đặt chức năng "C" bên ngoài độc lập. Điều này tránh sự hiểu lầm và những giả định nổi bật (ví dụ rằng tự được giả định là một C nhưng có thể trong thực tế là một cái gì đó khác). Nếu f() là công khai, tất cả điều này sẽ rất sạch sẽ. Nếu nó là riêng tư, bạn cần phải gọi lại cho bạn bè và khớp nối chặt chẽ này sẽ được đánh dấu một lần nữa.

Thay thế trình bao bọc sẽ chỉ thêm một người trung gian dự phòng để có cùng kết quả.

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