2015-06-04 14 views
17

W pliku C:\Program Files (x86)\Windows Kits\8.1\Include\um\OleAuto.h, znalazłem następujący kod, który nie wiem jak interpretować:Jaki jest sens podwójnej kropki w nawiasach kwadratowych w C++

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

Uwaga podwójne terminie, w kwadracie wspornik. Czy to nowy operator w C++?

+0

Wydaje się skręconą kombinacji wyrażeń SAL i prawdopodobnie nielegalnych intrinsics kompilatora. – gd1

+0

To na pewno nie jest wymienione tutaj: http://en.cppreference.com/w/cpp/language/operator_precedence. Ta strona jest całkiem dokładna inaczej: – TeaOverflow

+4

Założę się, że '_Outptr_result_buffer_' jest makrem, a argument nigdy nie jest widziany przez kompilator. (Jeśli tak, to zostanie odrzucony jako błąd składni). –

Odpowiedz

19

Wydaje się być adnotacja SAL używane do przekazania statyczny analizator że rozmiar bufora jest zbyt złożona, aby reprezentować przy użyciu zwykłych adnotacji:

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

To nie musi zawierać poprawną składnię , ale to, co zawiera, prawdopodobnie miało z grubsza zilustrować ludzkiemu czytelnikowi, jak można obliczyć rozmiar bufora.

Jeśli mam to interpretować siebie, to myślę, że to, co oznacza następujący kod przyniesie:

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

A SAL ma "zmniejszyć wady C++". Pisząc nonsensy w mało udokumentowanej intrinsyce. – gd1

+0

@ gd1: Domyślam się, że SAL została dodana do tej funkcji długo po jej prototypowaniu i zaimplementowaniu, a następnie prototyp tej funkcji nie mógł zostać zmieniony ani usunięty z powodu wymagań zgodności wstecznej. Generalnie jednak SAL jest naprawdę doskonała i jeśli znajdziesz deklaracje we własnym kodzie, które nie mogą być prawidłowo oznaczone SAL, jest to dobry sygnał, że powinieneś przemyśleć to, co zrobiłeś. –