Это хорошая практика ВСЕГДА приводить переменные в C? - PullRequest
2 голосов
/ 21 ноября 2011

Я пишу код на C и использую Windows API.Мне было интересно, было ли в любом случае хорошей практикой разыгрывать типы, которые явно одинаковы, но имеют другое имя?Например, при передаче от TCHAR * до strcmp(), который ожидает const char *.Должен ли я делать, предполагая, что я хочу написать строгий и во всех отношениях правильный C, strcmp((const char *)my_tchar_string, "foo")?

Ответы [ 4 ]

7 голосов
/ 21 ноября 2011

Не. Но также не используйте strcmp(), а скорее _tcscmp() (или даже безопасные альтернативы).

_tcs* обозначает полный набор функций времени выполнения C (строковых), которые будут работать правильно в зависимости от того, как препроцессор преобразует TCHAR.

Что касается безопасных альтернатив, ищите функции с завершающим _s и иначе именуемыми как классические строковые функции из среды выполнения C. Есть еще один набор функций, который возвращает HRESULT, но он не так совместим со средой выполнения C.

4 голосов
/ 21 ноября 2011

Нет, отбрасывать это не безопасно, потому что TCHAR не всегда равно char.Вместо приведения вы должны выбрать функцию, которая работает с TCHAR.Смотри http://msdn.microsoft.com/en-us/library/e0z9k731(v=vs.71).aspx

1 голос
/ 22 ноября 2011

Кастинг вообще плохая идея.Кастинг, когда вам не нужно, это ужасная практика.

Подумайте, что произойдет, если вы измените тип преобразуемой переменной?Предположим, что в будущем вы измените my_tchar_string на wchar_t*, а не char*.Ваш код по-прежнему будет компилироваться, но будет вести себя некорректно.

Одна из ваших основных целей при написании кода C состоит в том, чтобы минимизировать количество приведений в коде.

0 голосов
/ 22 ноября 2011

Мой совет - полностью избегать TCHAR (и связанных с ним функций).Их реальная цель состояла в том, чтобы позволить исходной кодовой базе компилироваться для 16-разрядных или 32-разрядных версий Windows, но 16-разрядные версии Windows давно ушли в прошлое, и вместе с ними появилась реальная причина для написания такого кода.

Если вы хотите / должны поддерживать широкие символы, сделайте это.Если у вас все в порядке только с узкими / многобайтовыми символами, сделайте это.По крайней мере, IME, попытка сесть на забор и выполнить некоторые из этих двух действий, как правило, означает, что в итоге вы не справляетесь ни с одним из них.Это также означает, что примерно вдвое объем необходимого тестирования не приближается даже к удвоению функциональности, которую вы предоставляете пользователю.

...