2010-02-17 41 views

Trả lời

52

Đây là phần mở rộng cụ thể của Microsoft đối với 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ữ.

Documentation

__declspec (C++)

+7

Cảm ơn - nhưng những gì tôi sẽ sử dụng nó cho? –

+4

Để khai báo các giao diện COM và các lớp, ví dụ, bạn sử dụng __declspec (uuid), đối với các hàm xuất khẩu, bạn sẽ tìm thấy tệp DEF bạn sử dụng __declspec (dllexport), vv Danh sách đầy đủ là khá dài. –

+1

@ScottJ Tôi liên tục sử dụng nó cho các thuộc tính: __declspec (thuộc tính (get = X put = X)) định danh kiểu dữ liệu. MSDN có nhiều chi tiết hơn. Là một lập trình viên "C# đến C/C++", đó là một phúc lạc! – MasterMastic

34

Các ví dụ kinh điển là __declspec(dllimport)__declspec(dllexport), mà chỉ thị cho mối liên kết để nhập khẩu và xuất khẩu (tương ứng) một biểu tượng từ hoặc một DLL.

// header 
__declspec(dllimport) void foo(); 


// code - this calls foo() somewhere in a DLL 
foo(); 

(__declspec(..) chỉ kết thúc tốt đẹp thứ cụ thể của Microsoft - để đạt được khả năng tương thích, người ta thường sẽ quấn nó đi với các macro)

+6

làm thế nào để bạn biết dllimport dll dllim trỏ đến? – tetris

+2

@tetris, bạn không biết từ mã. Quyết định được thực hiện bởi người liên kết, người sẽ chọn '.lib' đầu tiên mà nó tìm thấy có biểu tượng được xuất phù hợp. –

6

Về cơ bản, đó là cách Microsoft giới thiệu C mở rộng của nó ++ để họ sẽ không xung đột với các phần mở rộng trong tương lai của tiêu chuẩn C++. Với __declspec, bạn có thể gán một hàm hoặc một 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 (naked), ví dụ, ngăn chặn prolog/epilog thế hệ (cho trình xử lý ngắt, mã nhúng, vv), __declspec (thread) làm cho một biến thread địa phương, và như vậy.

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 và nền tảng trình biên dịch.

+0

Xem xét các trình biên dịch không phải là microsoft như 'GCC 4.2', cung cấp thay thế ngoài' __attribute__ ((dllexport)) 'của' __declspec (dllexport) ', có công bằng khi gọi' __declspec', một phần mở rộng chỉ dành cho Microsoft không? – user2338150

16

Chủ yếu được sử dụng để nhập ký hiệu từ/xuất khẩu ký hiệu vào thư viện được chia sẻ (DLL). Cả hai trình biên dịch Visual C++ và GCC đều hỗ trợ __declspec(dllimport)__declspec(dllexport). Các mục đích sử dụng khác (một số chỉ dành cho Microsoft) được ghi thành tài liệu in the MSDN.

10

Một ví dụ khác để minh họa cho từ khóa __declspec:

Khi bạn đang viết một driver Windows Kernel, đôi khi bạn muốn viết prolog/code Epilog của riêng bạn trình tự sử dụng inline mã lắp ráp, vì vậy bạn có thể khai báo chức năng của bạn với thuộc tính naked.

__declspec(naked) int func(formal_parameters) {} 

Hoặc

#define Naked __declspec(naked) 
Naked int func(formal_parameters) {} 

Vui lòng tham khảo naked (C++)

Các vấn đề liên quan