2010-11-21 5 views
17

Alcune di queste definizioni del preprocessore si trovano nella funzione WinMain e in altre funzioni della libreria di Windows. Qual è il loro scopo? Come funzionano? ed è buona pratica scriverli nelle implementazioni o nelle chiamate di funzione?Qual è lo scopo di __in __out __in_opt __allowed(), come funzionano? Dovrei usare costrutti simili nel mio codice?

La mia ricerca iniziale suggerisce che stanno semplicemente impostare equlivalent a:

#define __in 
#define __out 
#define __in_opt 

Nel senso che vengono sostituiti con nulla sul passo preprocessore. Sono solo un metodo di documentazione, senza alcuna funzionalità?

Se è così, posso vedere il vantaggio di documentare il codice in linea come questo. Con qualcosa come Doxygen è necessario scrivere i nomi dei parametri due volte. Quindi in teoria questo potrebbe aiutare a ridurre la duplicazione e mantenere la coerenza ...

Non ho alcuna teoria su come dovrebbe funzionare __allowed().

risposta

23

Sono annotazioni SAL nella lingua di annotazione codice sorgente. Gli strumenti Microsoft dipendono da questo. Articolo della biblioteca MSDN is here. Un buon esempio è Code Analysis. Un altro strumento abbastanza indipendente, ma abilitato da queste annotazioni è l'Assistente Interoperabilità di Pinvoke.

+0

Non è un problema quando gli strumenti dipendono da informazioni non affidabili e non corrette? –

+0

È sempre un problema quando i toold dipendono da informazioni errate. Le annotazioni SAL non sono diverse. Ovviamente è leggermente rischioso, ma questo è inerente all'architettura di dichiarazione/definizione di C: devi sempre assicurarti che si abbinino. – MSalters

+0

Le annotazioni @Cheers SAL vengono verificate mediante l'analisi del codice sia per il chiamante che per il chiamato. Le annotazioni non solo esprimono l'intento dell'autore ma sono anche verificate (ove possibile). In quanto tali, non sono né inaffidabili né errati. Si consideri 'void foo (_In_opt_ int * p) {* p = 42; } '.Il parametro 'p' è contrassegnato come facoltativo ma l'implementazione presuppone che sarà sempre valida. L'analisi del codice identificherà il problema e fornirà informazioni diagnostiche. – IInspectable

-2

Queste macro di Microsoft generalmente non si espandono a nulla e sono intese come suggerimenti per il lettore.

Tuttavia, l'ultima volta che ho controllato ad es. il suggerimento sugli argomenti MessageBox era completamente sbagliato, suggerendo che il primo, il secondo e il terzo argomento avevano valori predefiniti utili (quando si specifica 0), mentre in realtà il primo e il quarto argomento hanno valori predefiniti utili. Forse anche l'argomento titolo che per default è "Errore", ma non l'ho mai trovato utile. Quindi, è solo una cosa Microsoft, suggerisce che non si può e non si deve fare affidamento su, solo ingannevole confusione visiva.

Acclamazioni & hth.,

5

Sono utilizzati in uno strumento di analisi semantica Microsoft come marcature di codice. A meno che tu non abbia intenzione di utilizzare questo strumento tu stesso, non ha molto scopo usarli.

9

annotazioni SAL sono utili per due cose:

  • Analisi statica attraverso PREfast (compilare con/analizzare)
  • lettori umani possono guardare le annotazioni e capire come una funzione dovrebbe essere chiamata, e rapidamente determinare i parametri di input/output.

Le macro si espandono infatti a varie espressioni declspec quando il codice viene compilato con l'analisi. Io uso queste annotazioni tutto il tempo nel mio codice.