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?
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
@ user0042 Sẽ là 'tĩnh __cdecl' an toàn hơn sau đó không có gì? – Orient
Đó là chú thích không di động, nhưng có bạn có thể sử dụng chú thích đó. – user0042