2015-06-04 23 views
17

Trong tập tin C:\Program Files (x86)\Windows Kits\8.1\Include\um\OleAuto.h, tôi thấy đoạn mã sau mà tôi không biết làm thế nào để giải thích:là gì ý nghĩa của dấu chấm đôi trong một khung vuông trong C++

WINOLEAUTAPI SafeArrayAccessData(_In_ SAFEARRAY * psa, 
_Outptr_result_buffer_(_Inexpressible_(psa->cbElements * 
product(psa->rgsabound[0..psa->cDims-1]->cElements))) 
void HUGEP** ppvData); 

Lưu ý thời gian gấp đôi trong vòng vuông dấu ngoặc. Đó có phải là một toán tử mới trong C++ không?

+0

Nó có vẻ như một sự kết hợp xoắn của biểu thức SAL và intrinsics trình biên dịch có thể không có giấy tờ. – gd1

+0

Nó chắc chắn không được liệt kê ở đây: http://en.cppreference.com/w/cpp/language/operator_precedence. Trang web này là khá kỹ lưỡng nếu không – TeaOverflow

+4

Tôi sẽ đặt cược rằng '_Outptr_result_buffer_' là một vĩ mô, và đối số là không bao giờ nhìn thấy bởi trình biên dịch. (Nếu có, nó sẽ bị từ chối như một lỗi cú pháp.) –

Trả lời

19

Nó dường như là một chú thích SAL sử dụng để báo cho máy phân tích tĩnh rằng kích thước của bộ đệm là quá phức tạp để đại diện cho sử dụng chú thích thông thường:

https://msdn.microsoft.com/en-us/library/jj159527.aspx

Nó không nhất thiết phải chứa cú pháp hợp lệ , nhưng những gì nó chứa có lẽ có nghĩa là minh họa ngắn gọn cho một độc giả của con người như thế nào kích thước của bộ đệm có thể được tính toán.

Nếu tôi để giải thích bản thân mình, tôi đoán nó có nghĩa là những gì các mã sau đây sẽ mang lại:

DWORD CalculateInexpressibleSafeArrayDataSize(SAFEARRAY * psa) 
{ 
    DWORD cbSize = psa->cbElements; 
    for (int i = 0; i < psa->cDims; i++) // product() 
     cbSize *= psa->rgsabound[i]->cElements; 
    return cbSize; 
} 
+10

Và SAL được cho là "giảm thiểu lỗi C++". Bằng cách viết vô nghĩa bên trong hầu như không có tài liệu nội tại. – gd1

+0

@ gd1: Tôi đoán là SAL đã được thêm vào hàm đó lâu sau khi nó được tạo mẫu và được triển khai, và sau đó nguyên mẫu của hàm không thể thay đổi hoặc bị loại bỏ do các yêu cầu tương thích ngược. Nói chung, SAL thực sự tuyệt vời và nếu bạn tìm thấy các khai báo trong mã của riêng bạn mà không thể được đánh dấu một cách an toàn với SAL, đó là một dấu hiệu tốt cho thấy bạn nên suy nghĩ lại những gì bạn đã làm. –

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