TCHAR или собственный макрос?

257
18 октября 2017, 07:00

Недавно глянул в файл tchar.h и увидел объявленный тип TCHAR, который по сути дела делает тоже самое что и этот макрос:

#ifdef UNICODE
typedef wchar_t strt;
#elif
typedef char strt;
#endif

Теперь задаюсь вопросом, стоит ли использовать макрос, или же все таки готовым типом?

Answer 1

Если Вы работаете под Windows, а судя по упоминанию tchar.h это действительно так. И Ваше приложение должно поддерживать сборку как для широких wchar_t символов, так и для узких char, то использование типа TCHAR, единнственно правильное решение. Другое дело, что в современном мире потребности в этом возникать не должно и поддержка Unicode должна быть доступна номинально.

Что об этом пишет Microsoft:

Back when applications needed to support both Windows NT as well as Windows 95, Windows 98, and Windows Me, it was useful to compile the same code for either ANSI or Unicode strings, depending on the target platform. To this end, the Windows SDK provides macros that map strings to Unicode or ANSI, depending on the platform.

Answer 2

В 2017 году нет никакого смысла собирать программу без -DUNICODE.
Вместо TCHAR надо использовать wchar_t.

Answer 3

Как учит нас Страуструп, лучше пользоваться типом, чем макросом. Потому что макросы это зло типонебезопасное, а тип проверяется компилятором с учетом всех зависимостей для данной платформы. Включая участие в шаблонах и прочие чудеса науки.

UPD1:

не всегда есть возможность к примеру полностью переписывать класс для тестирования поведения в разных кодировках

Это не мое мнение, это я у Страуструпа вычитал (дай ему Бог здоровьичка) еще в одном из первых изданий по С++. Там было написано, что теперь отныне и вовеки макросы нужны только для предотвращения зацикливания хедеров. Что касается тестирования программы с разными типами данных, то нужно использовать typedef для быстрого переопределения типа. Но не макрос. То есть в своей программе пишете:

typedef char my_char;

и работаете с my_char. А когда надо работать с широким байтом, то переопределяете:

typedef wchar_t my_char;

и снова работаете с my_char.

READ ALSO
uniform_real_distribution is not uniform

uniform_real_distribution is not uniform

Пожалуйста, помогите мне понять этоПосле запуска этого фрагмента:

334
Лишний вывод в файл

Лишний вывод в файл

Вот у меня есть функция, которая создает файл размеров в 10 КБ

255
Знакомство с тестами

Знакомство с тестами

Никогда не писал модульных тестов, появилось задание с ними познакомиться и научиться использоватьЕсть некая функция "сортировки" массива...

230