Con GCC, posso specificare __attribute__((format(printf, 1, 2)))
, dicendo al compilatore che questa funzione accetta parametri vararg che sono specificatori del formato printf.__attribute __ ((formato (printf, 1, 2))) per MSVC?
Questo è molto utile nei casi in cui mi avvolgo ad es. la famiglia di funzioni vsprintf. Posso avere extern void log_error(const char *format, ...) __attribute__((format(printf, 1, 2)));
E ogni volta che chiamo questa funzione, gcc verificherà che i tipi e il numero di argomenti si conformino agli specificatori di formato dati come farebbero per printf e emetteranno un avviso se non lo sono.
Il compilatore Microsoft C/C++ ha qualcosa di simile?
In realtà, sembra che tale controllo non esca: vedere [risposta di sixlettervariables] (http://stackoverflow.com/questions/2354784/attribute-formatprintf-1-2-for-msvc/6849629#6849629). –
@RaphaelISP: se leggi il link in quella risposta, vedrai che le annotazioni SAL vengono ignorate a meno che non sia l'opzione [/analyze](http://msdn.microsoft.com/en-us/library/ms173498.aspx) è specificato e questo è disponibile solo nelle edizioni Enterprise di Visual Studio. Inoltre i controlli che vengono eseguiti non sono dello stesso tipo di GCC. Una risposta alternativa dopo un anno dopo aver chiesto appena giustificato un downvote della risposta accettata senza comprendere l'applicabilità dell'alternativa. – Clifford
@Raphae:/analyze esegue un numero di verifiche relative alle stringhe in stile printf (vedere [C6270-C6274] (http://msdn.microsoft.com/en-us/library/a5b9aa09.aspx) e altri, ma non sono così approfonditi come quelli di GCC. L'unico in Enterprise è solo un problema di "tipo", come si dovrebbe evitare VS se non lo si sta acquistando. – user7116