Почему существует макрос, который определяет _tmain? - PullRequest
7 голосов
/ 08 февраля 2011

Я новичок в кодировании C ++, пришло из Java и C # фона.Я озадачен распространением терминов #define, начиная с самых простых:

#define _tmain wmain

Когда я впервые узнал немного о C, основная функция была:

int main(int argc, char *argv[])

В проекте Visual C ++, который я создал, он сделал основную функцию:

int _tmain(int argc, _TCHAR* argv[])

Мне просто интересно, почему нужно было переводить имя с wmain на _tmain?Почему бы просто не использовать оригинальный прототип функции C main?

В общем, кажется, что много #define переименовывает что-то, что выглядит довольно ясным для начала, в то, что выглядит более загадочным и менее ясным (язначит wmain до _tmain ??).

Спасибо за то, что вы поняли, что может быть очень очевидным вопросом.

Ответы [ 2 ]

13 голосов
/ 08 февраля 2011

Это особенность Visual C ++, она не является частью C ++.

Большинство функций Windows API имеют две версии: те, которые заканчиваются на W, которые предназначены для использования с широкими символьными строками (wchar_t строки), и те, которые заканчиваются на A, которые предназначены для использования с узкими символьные строки (char строки). Реальные «функции» Windows API не имеют суффиксов и определяются как макросы, которые расширяются до нужной версии в зависимости от настроек.

Имена T (например, _TCHAR и _tmain) предназначены для одной и той же цели: они представляют собой макросы, которые расширяются до нужного имени в зависимости от настроек компиляции, поэтому wchar_t и wmain для широких символов поддержка, или char и main для поддержки узких символов.

Идея состоит в том, что если вы пишете свой код, используя независимые от символьных типов имена (имена T), вы можете скомпилировать код, используя узкие символы (ASCII) или широкие символы (Unicode), не меняя его. Компромисс в том, что ваш код менее переносим.

5 голосов
/ 08 февраля 2011

Поскольку Microsoft решила, что лучший способ добавить поддержку Unicode в C ++ - это добавить тип TCHAR, который #defined определен для char или wchar_t в зависимости от значения свойств проекта> Свойства конфигурации> Общие > Набор символов. _tmain также определяется # main (что занимает char с) или wmain (что wchar_t с) в зависимости от этого параметра.

...