2010-04-08 9 views
6

Der folgende Code erzeugt eine Warnung C6284, wenn mit /analyze auf MSVC 2008 kompiliert: Objekt als Parameter '% s' übergeben, wenn Zeichenfolge in Call to Function erforderlich ist. SieWie C6284 zu verhindern, wenn CString :: Format verwendet?

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

Als Alternative:

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

Ich bin für eine schöne Lösung für diese Suche, die nicht static_cast

Antwort

6

Microsoft beschreibt die Verwendung von CString mit variabler Argument Funktionen here erfordern würde kann auch die Methode PCXSTR CString::GetString() const; verwenden, um zu versuchen, die Warnung zu beheben:

+0

Bin ich falsch oder die richtige Lösung ist 'str.GetBuffer()' zu verwenden? – sorin

+1

Sie könnten beide für Ihre Situation verwenden, aber sie haben unterschiedliche Bedeutungen für den Leser. 'GetBuffer()' gibt einen String-Puffer zurück, der eine direkte Modifikation (nicht "const") des 'CString'-Objekts erlaubt, während' GetString() 'einen' const'-Puffer für den Nur-Lese-Zugriff zurückgibt. –

3

Einer der Konstruktionsfehler von CString, Err, Features ist, dass es eine implizite Konvertierung zu LPCTSTR aufweist, die die Warnung nicht so aussagekräftig macht. Aber wenn man sich die Microsoft documentation anschaut, verwenden sie tatsächlich in ihrem eigenen Beispiel Umwandlungen. Ich sehe nicht wirklich die Notwendigkeit, eine static_cast hier zu vermeiden, in der Tat würde ich es begrüßen, da es die implizite Konvertierung expliziter und damit leichter zu erkennen macht.

Verwandte Themen