__declspec
là thuộc tính dành riêng cho Microsoft cho phép bạn chỉ định thông tin lớp lưu trữ.
(Góc của Nitpicker: Tuy nhiên, một số nhà cung cấp trình biên dịch khác — ví dụ như GCC — bây giờ hỗ trợ phần mở rộng ngôn ngữ này cho khả năng tương thích với cơ sở mã được cài đặt nhắm vào trình biên dịch của Microsoft. Một số thậm chí cung cấp các thuộc tính lớp lưu trữ bổ sung.)
Hai trong số các thuộc tính lớp lưu trữ có thể được chỉ định là dllimport
và dllexport
. Điều này chỉ ra cho trình biên dịch rằng một hàm hoặc đối tượng được nhập khẩu hoặc xuất khẩu (tương ứng) từ một DLL.
Cụ thể hơn, chúng xác định giao diện của DLL cho máy khách mà không yêu cầu tệp định nghĩa mô-đun (.DEF
). Hầu hết mọi người thấy việc sử dụng các phần mở rộng ngôn ngữ này dễ dàng hơn nhiều so với việc tạo các tệp DEF.
Vì lý do hiển nhiên, __declspec(dllimport)
và __declspec(dllexport)
thường được ghép nối với nhau. Bạn sử dụng dllexport
để đánh dấu một biểu tượng được xuất từ tệp DLL và bạn sử dụng dllimport
để nhập biểu tượng đã xuất đó vào tệp khác.
Vì điều này và vì cùng một tệp tiêu đề thường được sử dụng khi biên dịch DLL và mã khách hàng tiêu thụ giao diện của DLL, đây là một mẫu phổ biến để xác định macro tự động phân giải đến trình chỉ định thuộc tính thích hợp tại thời gian biên dịch. Ví dụ:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Sau đó đánh dấu tất cả các biểu tượng cần xuất với DLLEXPORT
.
Có lẽ, đó là những gì mà macro Q_CORE_EXPORT
thực hiện, giải quyết hoặc Q_DECL_IMPORT
hoặc Q_DECL_EXPORT
.
Nguồn
2012-01-14 15:38:51
bản sao có thể có của [Tại sao/khi nào __declspec (dllimport) không cần thiết?] (Http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed) –