2010-04-08 5 views
6

Il seguente codice genera avviso C6284 quando compilato con /analyze su MSVC 2008: oggetto passato come parametro '% s' quando la stringa è richiesta nella chiamata alla funzione.Come prevenire C6284 quando si utilizza CString :: Format?

CString strTmp, str; 
str = L"aaa.txt" 
strTmp.Format (L"File: %s", str); 

Sto cercando una bella soluzione per questo che non richiederebbe static_cast

risposta

6

Microsoft descrive l'utilizzo di CString con funzioni di argomenti variabili here:

CString kindOfFruit = "bananas"; 
int  howmany = 25; 
printf_s("You have %d %s\n", howmany, (LPCTSTR)kindOfFruit); 

In alternativa si puoi anche utilizzare il metodo PCXSTR CString::GetString() const; per provare a correggere l'avviso:

CString strTmp, str; 
str = L"aaa.txt" 
strTmp.Format (L"File: %s", str.GetString()); 
+0

Mi sbaglio o la soluzione corretta è usare 'str.GetBuffer()'? – sorin

+1

Puoi utilizzare entrambi per la tua situazione, ma hanno significati diversi per il lettore. 'GetBuffer()' restituisce un buffer di stringhe che consente la modifica diretta (non 'const') dell'oggetto' CString' mentre 'GetString()' restituisce un buffer 'const' per l'accesso in sola lettura. –

3

Uno dei difetti di progettazione di CString, err, è che presenta una conversione implicita a LPCTSTR che rende l'avviso non significativo IMHO. Ma comunque, se guardi allo Microsoft documentation, in realtà usano i calchi nel loro stesso esempio. Non vedo davvero la necessità di evitare uno static_cast qui, in realtà lo accetterei in quanto rende la conversione implicita più esplicita e quindi più facile da individuare.

Problemi correlati