Câu trả lời:
Đây là một phần mở rộng cụ thể của Microsoft cho ngôn ngữ C ++, cho phép bạn gán một loại hoặc chức năng với thông tin lớp lưu trữ.
Tài liệu
Các ví dụ chính tắc là __declspec(dllimport)
và __declspec(dllexport)
, hướng dẫn trình liên kết nhập và xuất (tương ứng) một ký hiệu từ hoặc sang DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)
chỉ kết thúc nội dung cụ thể của Microsoft - để đạt được khả năng tương thích, người ta thường sẽ gói nó bằng macro)
.lib
tìm thấy có biểu tượng xuất khẩu phù hợp.
Nó chủ yếu được sử dụng để nhập các biểu tượng từ / xuất biểu tượng vào thư viện dùng chung (DLL). Cả trình biên dịch Visual C ++ và GCC đều hỗ trợ __declspec(dllimport)
và __declspec(dllexport)
. Các cách sử dụng khác (chỉ một số Microsoft) được ghi lại trong MSDN .
Một ví dụ khác để minh họa từ khóa __declspec :
Khi bạn đang viết Trình điều khiển hạt nhân Windows, đôi khi bạn muốn viết các chuỗi mã prolog / epilog của riêng mình bằng mã trình biên dịch mã nội tuyến , do đó bạn có thể khai báo hàm của mình bằng thuộc tính trần .
__declspec( naked ) int func( formal_parameters ) {}
Hoặc là
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Vui lòng tham khảo trần truồng (C ++)
Về cơ bản, đó là cách Microsoft giới thiệu các phần mở rộng C ++ của mình để chúng không xung đột với các phần mở rộng của C ++ tiêu chuẩn trong tương lai. Với __declspec, bạn có thể gán một hàm hoặc lớp; ý nghĩa chính xác khác nhau tùy thuộc vào bản chất của __declspec. __declspec (trần trụi), ví dụ, ngăn chặn việc tạo prolog / epilog (đối với các trình xử lý ngắt, mã nhúng, v.v.), __declspec (luồng) tạo ra một luồng cục bộ biến, v.v.
Danh sách đầy đủ các thuộc tính __declspec có sẵn trên MSDN và thay đổi theo phiên bản trình biên dịch và nền tảng.
GCC 4.2
, cung cấp giải pháp thay thế ngoài __attribute__ ((dllexport))
việc __declspec(dllexport)
, chúng có công bằng khi gọi __declspec
, một phần mở rộng chỉ dành cho Microsoft không?
Tôi biết đã tám năm nhưng tôi muốn chia sẻ đoạn mã này được tìm thấy trong MRuby cho thấy làm thế nào __declspec()
con ong có thể sử dụng ở cùng cấp độ với export keyword
.
/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
__declspec(dllexport)
trước mỗi chức năng trong thư viện của mình