Tôi đã đọc rằng chuyển đổi một con trỏ hàm thành một con trỏ dữ liệu và ngược lại hoạt động trên hầu hết các nền tảng nhưng không được đảm bảo để hoạt động. Tại sao điều này là trường hợp? Cả hai không nên đơn giản là địa chỉ vào bộ nhớ chính và do đó tương thích?
void
. Chuyển đổi một con trỏ hàm thành void *
sẽ không làm thay đổi biểu diễn. Một void *
giá trị kết quả từ một chuyển đổi như vậy có thể được chuyển đổi trở lại loại con trỏ hàm ban đầu, sử dụng một biểu thức rõ ràng, mà không mất thông tin. Lưu ý : Tiêu chuẩn ISO C không yêu cầu điều này, nhưng nó được yêu cầu cho sự phù hợp POSIX.
dlsym()
- lưu ý phần cuối của phần 'Sử dụng ứng dụng' có ghi: Lưu ý rằng việc chuyển đổi từ một void *
con trỏ sang một con trỏ hàm như trong: fptr = (int (*)(int))dlsym(handle, "my_function");
không được xác định bởi tiêu chuẩn ISO C. Tiêu chuẩn này yêu cầu chuyển đổi này để hoạt động chính xác trong việc thực hiện tuân thủ.