2010-04-08 5 views
6

Le code suivant génère un avertissement C6284 lorsqu'il est compilé avec /analyze sur MSVC 2008: objet passé en paramètre '% s' lorsqu'une chaîne est requise dans l'appel à la fonction.Comment empêcher C6284 en utilisant CString :: Format?

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

Je suis à la recherche d'une solution agréable pour ce qui ne nécessiterait pas static_cast

Répondre

6

Microsoft décrit l'utilisation de CString avec des fonctions d'arguments variables here:

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

Comme alternative, vous peut également utiliser la méthode PCXSTR CString::GetString() const; pour essayer de résoudre l'avertissement:

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

Ai-je tort ou la bonne solution est d'utiliser 'str.GetBuffer()'? – sorin

+1

Vous pouvez utiliser les deux pour votre situation, mais ils ont des significations différentes pour le lecteur. 'GetBuffer()' renvoie un tampon de chaîne qui permet la modification directe (pas 'const') de l'objet' CString' tandis que 'GetString()' renvoie un tampon 'const' pour l'accès en lecture seule. –

3

Un des défauts de conception de CString, err, caractéristiques est qu'il comporte une conversion implicite à LPCTSTR qui rend l'avertissement pas si IMHO significatif. Mais de toute façon, si vous regardez le Microsoft documentation, ils utilisent réellement des castes dans leur propre exemple. Je ne vois pas vraiment le besoin d'éviter un static_cast ici, en fait je l'apprécierais car cela rend la conversion implicite plus explicite et donc plus facile à repérer.

Questions connexes