Strano avviso di annotazione SAL
-
19-08-2019 - |
Domanda
Sto cercando di utilizzare l'annotazione SAL di Micosoft per il mio progetto, tuttavia ricevo il seguente avviso e non so perché.
Ad esempio, ho creato una nuova applicazione console C ++ e ho questo codice:
#include <sal.h>
class Whatever
{
public:
_Check_return_ int Method(__in int number) ;
};
int main()
{
return 0;
}
Quando compilo usando Visual Studio 2008, ricevo il seguente avviso:
avviso C6540: l'uso delle annotazioni degli attributi su questa funzione invaliderà tutte le sue annotazioni __declspec
Nel file " c1xxast "
Cosa sto facendo di sbagliato? Se rimuovo _Check_return_
o __in
, l'avviso scompare.
Non riesco a trovare alcun riferimento all'avvertimento C6550. Tuttavia lo stesso testo può essere trovato qui: http://msdn.microsoft.com /en-us/library/dd445322.aspx , ma non è molto utile.
Soluzione
Il problema potrebbe essere dovuto al fatto che si stanno mescolando i tipi di annotazione SAL. Sebbene reso molto chiaro su MSDN, esistono due tipi di annotazione SAL: attributo e ... er ... no.
I #define
s in <sal.h>
VC2005 utilizzano le versioni non di attributo e iniziano con un carattere di sottolineatura seguito da una lettera minuscola . Le versioni più recenti di VC2008 si espandono agli attributi del compilatore e iniziano (e terminano) con un carattere di sottolineatura seguito da una lettera maiuscola .
Hai mescolato i due tipi:
Attributo:
- _In _
- _Check_return _
Non attributo:
- __ in
- __ checkReturn
Prova a modificare le annotazioni per utilizzare un singolo tipo in modo coerente.
Questo post sul blog spiega qualcosa in più al riguardo.
Altri suggerimenti
È necessario aggiungere annotazioni SAL sia alla dichiarazione che alla definizione di un metodo. Sto indovinando SAL perché non riesce a trovare la definizione del metodo e presume che gli attributi siano mancanti.
MODIFICA Chiarimento
Le promozioni SAL devono apparire in entrambe le posizioni per metodi non astratti. Per i metodi astratti SAL non cercherà una definizione. In alcune configurazioni garantirà effettivamente che l'implementazione dell'interfaccia abbia le notazioni appropriate.