2015-06-04 10 views
17

Nel file C:\Program Files (x86)\Windows Kits\8.1\Include\um\OleAuto.h, ho trovato il seguente codice che non so come interpretare:Qual è il significato di un doppio punto all'interno di una parentesi quadra in C++

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

Annotare il doppio periodo all'interno del quadrato staffa. È un nuovo operatore in C++?

+0

sembra come una combinazione di espressioni contorto Sal e intrinseci compilatore probabilmente privi di documenti. – gd1

+0

Di sicuro non è elencato qui: http://en.cppreference.com/w/cpp/language/operator_precedence. Questo sito è abbastanza completo altrimenti – TeaOverflow

+4

Scommetto che '_Outptr_result_buffer_' è una macro, e l'argomento non è mai visto dal compilatore. (Se lo fosse, verrebbe rifiutato come errore di sintassi.) –

risposta

19

Sembra essere un'annotazione SAL utilizzato per raccontare l'analizzatore statica che la dimensione del buffer è troppo complesso per rappresentare con le annotazioni ordinarie:

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

Esso non deve contenere sintassi valida , ma ciò che contiene probabilmente è pensato per illustrare sinteticamente ad un lettore umano come si potrebbe calcolare la dimensione del buffer.

Se devo interpretare me stesso, direi che significa ciò che il seguente codice produrrebbe:

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

E SAL dovrebbe "ridurre i difetti del C++". Scrivendo assurdità all'interno di elementi intrinseci difficilmente documentati. – gd1

+0

@ gd1: La mia ipotesi è che SAL sia stato aggiunto a quella funzione molto tempo dopo che è stato prototipato e implementato, e quindi il prototipo della funzione non può essere modificato o rimosso a causa dei requisiti di compatibilità a ritroso. In generale, tuttavia, SAL è veramente eccellente e se trovi dichiarazioni nel tuo codice che non possono essere corrette con SIG, è una buona indicazione che dovresti ripensare a quello che hai fatto. –

Problemi correlati