2010-04-08 7 views
6

El siguiente código genera la advertencia C6284 cuando se compiló con /analyze en MSVC 2008: objeto pasado como parámetro '% s' cuando se requiere una cadena en la llamada a la función.Cómo prevenir C6284 al usar CString :: Formato?

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

Estoy buscando una buena solución para esto que no requeriría static_cast

Respuesta

6

Microsoft describe el uso de CString con funciones de argumentos variables here:

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

Como alternativa, se también puede usar el método PCXSTR CString::GetString() const; para tratar de corregir la advertencia:

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

¿Me equivoco o la solución correcta es usar 'str.GetBuffer()'? – sorin

+1

Puede usar ambos para su situación, pero tienen diferentes significados para el lector. 'GetBuffer()' devuelve un búfer de cadena que permite la modificación directa (no 'const') del objeto' CString', mientras que 'GetString()' devuelve un búfer 'const' para el acceso de solo lectura. –

3

Uno de los defectos de diseño de CString, err, características es que cuenta con una conversión implícita a LPCTSTR que hace que la advertencia no sea tan significativa en mi humilde opinión. Pero de todos modos, si nos fijamos en el Microsoft documentation, en realidad usan moldes en su propio ejemplo. Realmente no veo la necesidad de evitar un static_cast aquí, de hecho lo agradecería ya que hace que la conversión implícita sea más explícita y, por lo tanto, más fácil de detectar.

Cuestiones relacionadas