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()
.
Non è un problema quando gli strumenti dipendono da informazioni non affidabili e non corrette? –
È 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
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