Как предотвратить C6284 при использовании CString :: Format? - PullRequest
6 голосов
/ 08 апреля 2010

Следующий код генерирует предупреждение C6284 при компиляции с /analyze в MSVC 2008: объект передается как параметр "% s", когда в вызове функции требуется строка.

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

Я ищу хорошее решение для этого, которое не потребует static_cast

Ответы [ 2 ]

6 голосов
/ 08 апреля 2010

Microsoft описывает использование CString с функциями переменных аргументов здесь :

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

В качестве альтернативы вы также можете использовать метод PCXSTR CString::GetString() const;, чтобы попытаться исправить предупреждение:

CString strTmp, str;
str = L"aaa.txt"
strTmp.Format (L"File: %s", str.GetString());
3 голосов
/ 08 апреля 2010

Одной из недостатков дизайна CString является то, что он имеет неявное преобразование в LPCTSTR, что делает предупреждение не таким значимым, как имхо. Но в любом случае, если вы посмотрите на документацию Microsoft , они фактически используют приведение в своем собственном примере. На самом деле я не вижу необходимости избегать static_cast здесь, на самом деле я бы приветствовал его, поскольку он делает неявное преобразование более явным и, следовательно, его легче обнаружить.

...