Was bedeutet ein doppelter Punkt in einer eckigen Klammer in C++?

Was bedeutet ein doppelter Punkt in einer eckigen Klammer in C++?


In der Datei C:\Program Files (x86)\Windows Kits\8.1\Include\um\OleAuto.h , habe ich den folgenden Code gefunden, den ich nicht interpretieren kann:


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

Beachten Sie den doppelten Punkt in der eckigen Klammer. Ist das ein neuer Operator in C++?


Antworten:


Es scheint eine SAL-Anmerkung zu sein, die verwendet wird, um dem statischen Analysator mitzuteilen, dass die Größe des Puffers zu komplex ist, um mit gewöhnlichen Anmerkungen dargestellt zu werden:


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


Es muss keine gültige Syntax enthalten, aber was es enthält, soll einem menschlichen Leser wahrscheinlich kurz und bündig veranschaulichen, wie die Größe des Puffers berechnet werden könnte.


Wenn ich es selbst interpretieren soll, würde ich vermuten, dass es das bedeutet, was der folgende Code ergeben würde:


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

Einige Code-Antworten


WINOLEAUTAPI SafeArrayAccessData(_In_ SAFEARRAY * psa, _Outptr_result_buffer_(_Inexpressible_(psa->cbElements *  product(psa->rgsabound[0..psa->cDims-1]->cElements)))  void HUGEP** ppvData);
DWORD CalculateInexpressibleSafeArrayDataSize(SAFEARRAY * psa) {
DWORD cbSize = psa->cbElements;
for (int i = 0;
i <
psa->cDims;
i++) // product()
cbSize *= psa->rgsabound[i]->cElements;
return cbSize;
}