2010-11-21 9 views
17

Một số định nghĩa tiền xử lý này có trong hàm WinMain và các chức năng thư viện cửa sổ khác. Mục đích của chúng là gì? Họ làm việc như thế nào? và thực hành tốt là viết chúng vào triển khai hoặc gọi hàm của bạn?Mục đích của __in __out __in_opt __allowed() là gì, chúng hoạt động như thế nào? Tôi có nên sử dụng các cấu trúc tương tự trong mã của riêng mình không?

nghiên cứu ban đầu của tôi cho thấy họ đang chỉ cần thiết lập equlivalent tới:

#define __in 
#define __out 
#define __in_opt 

Ý nghĩa họ nhận được thay thế bằng trên đèo Preprocessor. Chúng chỉ là một phương pháp tài liệu, không có chức năng nào?

Nếu có, tôi có thể thấy lợi thế để ghi lại mã theo dòng như sau. Với một cái gì đó như doxygen bạn cần phải viết ra các tên tham số hai lần. Vì vậy, điều này có thể trong lý thuyết giúp giảm trùng lặp, và duy trì tính nhất quán ...

Tôi không có lý thuyết về cách __allowed() được cho là hoạt động.

Trả lời

23

Chúng là chú thích SAL trong Ngôn ngữ chú thích mã nguồn. Microsoft tooling phụ thuộc vào nó. Bài viết trong Thư viện MSDN is here. Một ví dụ điển hình là Code Analysis. Một công cụ khá không liên quan khác, nhưng được trao quyền bởi các chú thích này là Trợ lý tương tác Pinvoke.

+0

Nó không phải là một vấn đề khi các công cụ phụ thuộc vào thông tin không đáng tin cậy và không chính xác? –

+0

Nó luôn luôn là một vấn đề khi toolds phụ thuộc vào thông tin không chính xác. Chú thích SAL không khác nhau. Đó là tất nhiên một chút rủi ro, nhưng đó là vốn có của kiến ​​trúc khai báo/định nghĩa của C - bạn luôn phải đảm bảo rằng chúng khớp với nhau. – MSalters

+0

@ Chú thích SAL của người dùng được kiểm tra bằng cách phân tích mã cho cả người gọi cũng như người bình thường. Các chú thích không chỉ thể hiện ý định của tác giả mà còn được xác minh (nếu có thể). Vì vậy, chúng không đáng tin cậy và không chính xác. Hãy xem xét 'void foo (_In_opt_ int * p) {* p = 42; } '.Tham số 'p' được đánh dấu là tùy chọn nhưng việc triển khai giả định rằng nó sẽ luôn hợp lệ. Phân tích mã sẽ xác định vấn đề và cung cấp thông tin chẩn đoán. – IInspectable

-2

Các macro này của Microsoft thường mở rộng thành không có gì và có nghĩa là gợi ý cho người đọc.

Tuy nhiên, lần cuối tôi đã kiểm tra ví dụ: các gợi ý trên các đối số MessageBox hoàn toàn sai, gợi ý rằng đối số đầu tiên, thứ hai và thứ ba có các giá trị mặc định hữu ích (khi bạn chỉ định 0), trong khi thực tế, đối số đầu tiên và thứ tư có các giá trị mặc định hữu ích. Có lẽ cũng là đối số tiêu đề mặc định là "Lỗi", nhưng tôi chưa bao giờ thấy hữu ích. Vì vậy, nó chỉ là một điều Microsoft, gợi ý rằng bạn không thể và không nên dựa vào, chỉ gây nhầm lẫn hình ảnh lộn xộn.

Cheers & h.,

5

Họ đang sử dụng trong một công cụ phân tích ngữ nghĩa của Microsoft như đánh dấu mã. Trừ khi bạn có kế hoạch sử dụng công cụ này cho mình, có rất ít mục đích trong việc sử dụng chúng.

9

chú thích SAL có ích cho hai điều:

  • phân tích tĩnh thông qua PREfast (biên dịch với/phân tích)
  • độc giả người có thể nhìn vào các chú thích và tìm ra cách một chức năng nên được gọi, và nhanh chóng xác định các tham số đầu vào/đầu ra.

Macro thực tế mở rộng đến các biểu thức declspec khác nhau khi mã của bạn được biên dịch cùng với phân tích. Tôi sử dụng các chú thích này mọi lúc trong mã của tôi.