Tôi cần liên kết động với chức năng thư viện khi chạy trong Mac OS X. Theo sau Apple's example, tôi khai báo con trỏ hàm và gán nó với kết quả của dlsym(). Ví dụ sau đây biên dịch thành công dưới dạng tệp C (.c) đơn giản. Nhưng tôi cần điều này trong một tệp C++ và nếu tôi biên dịch ví dụ này dưới dạng tệp C++ (.cpp), trình biên dịch clang sẽ cho tôi biếtChức năng gán con trỏ hoạt động trong C nhưng không phải C++
Không thể khởi tạo biến loại 'void () (char *)' với giá trị của loại 'void '
Tại sao nó lại hoạt động trong đồng bằng 'C' và cách khắc phục điều này?
#include <dlfcn.h>
void Test() {
// Load the library which defines myFunc
void* lib_handle = dlopen("myLib.dylib", RTLD_LOCAL|RTLD_LAZY);
// The following line is an error if compiled as C++
void (*myFunc)(char*) = dlsym(lib_handle, "myFunc");
myFunc("Hello");
dlclose(lib_handle) ;
}
... hoặc có thể 'static_cast': http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to- bất cứ điều gì –
Phiên bản của tiêu chuẩn C Tôi đã nói rằng một con trỏ đến 'void' có thể được chuyển đổi thành hoặc từ một con trỏ đến bất kỳ loại _object_ nào (nhấn mạnh thêm). Hàm không phải là kiểu đối tượng và C chưa bao giờ cho phép chuyển đổi (rõ ràng hoặc ẩn) giữa 'void *' và con trỏ đến hàm. Tôi không chắc chắn, nhưng tôi nghĩ rằng một chẩn đoán là bắt buộc. (Tôi không nghĩ rằng đó là hành vi không xác định.) Và diễn viên rõ ràng (thậm chí 'reinterpret_cast') cũng không nên hoạt động. (Hầu hết các trình biên dịch Unix không phù hợp với vấn đề này, nhưng vì nó là phần mở rộng, mỗi trình biên dịch tự do làm những gì nó thích.) –
@JamesKanze đúng, C không có chuyển đổi ngầm từ 'void *' sang bất kỳ con trỏ nào sang loại chức năng. Trình biên dịch C phù hợp phải đưa ra chẩn đoán (có thể chỉ là cảnh báo); một trình biên dịch C không phù hợp, như hầu hết là theo mặc định, có thể làm bất cứ điều gì nó thích. –