![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Можно ли в C++ Builder использовать вызов main() как главную функцию (без define)?
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Что значит "без define"? WinMain используется в Win32 приложениях, а main в стандартных C прогах (в DOS, Unix .....)
Разгадка в том, что на самом деле выполнение Вашей программы начинается с C RunTime (CRT). Это код, который автоматически компануется с программой, и выполняет различные начальные операции и установки, а также вызывает Вашу функцию main или WinMain, а когда она (main или WinMain) возвращает управление в CRT, последняя выполняет некоторые заключительные операции. Так вот, если Вы пишите программу для Windows, то компилятор компанует CRT для Windows. Этот код вызывает WinMain. Если прога для консольного выполнения - то компилятор компанует CRT для консоли. Тот код вызывает main. В Builder'е CRT находится в файлах \lib\c0*.obj. Их там несколько. Потому что кроме того, что программа может быть написана для Windows или для DOS, программа может быть написана на C++ или чистом C. А C++ тоже требует своей CRT с операторами new, delete, <<, >> и других. Так что если ты создал проект для Win32, то должен использовать только WinMain, а если проект создавался для DOS - то только main. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Ну вот, кстати, можно под винды писать без CRT
А про точку входа, дык можно её переназначить з.ы. да и вместо new можно использовать GlobalAlloc etc. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Baa, я с тобой согласен, но вопрос был не о CRT, а о функциях main и WinMain. Я и попытался объяснить, что откуда берётся. А про мизерные приложения вопрошающему, по-моему, ещё рано объяснять. Это ему только прибавит головной боли.
P.S. Написать прогу совсем без CRT нельзя, минимальная CRT: вызов функции main. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
NiJazz, вот
http://www.rsdn.ru/article/cpp/crt.xml там и про WinMain, и про CRT Правда не про билдер, но тоже весьма познавательно -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| GanZaleZ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 15.7.2003 Репутация: нет Всего: нет |
Привет всем !
Хмм ... Я вот подумал и решил что тоже не могу понять какое различие ?? Именно различие какое кроме точки входа Сачала кинулась мысль нащет выборки сообщений и все такое , но поразмыслив я решил что в консоли то тоже есть выборка сообщений только внутри и еще подума почемуто пришол к выводу что они отличаются только тем что : При вызове WinMain() система отдает прорисовку , обработку событий и тд.и тп. тибе ,тобиш разработчику , а при вызове консол апликейшн , тобиш main() , полность за окно отвечает сама система ! Вот к чему я пришол ! |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Все еще проще
/SUBSYSTEM:CONSOLE или /SUBSYSTEM:WINDOWS -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Слушай, Baa. Ну, я с тобой не согласен. Разница не в определении, а в подходе к вопросу. main получает параметры командной строки и ориентирована прежде всего не на консоль, а на DOS, Unix и т.п. WinMain ввели именно из-за нового подхода к программированию в Windows. Без этой функции пришлось бы придумывать разные хитрости, чтоб программа могла узнать свой дескриптор, ну и режим отображения окна, что, конечно, уже не так важно.
P.S. Я согласен, что любое соглашение надумано и его можно обойти, сказав, например, что в моей проге главной будет функция WinMustDie с моим набором параметров, но я не хотел бы, чтоб после этой темы, начинающие программисты думали, что main и WinMain - это одно и то же. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Хорошо, я с тобой соглашусь, но только ради начинающих программеров
Просто это мне напоминает догму, что на 0 делить нельзя... Вобщем, предлагаю остановиться (это аутотренинг...) на выдержке из MSDN'а
з.ы. "...Как и все остальные, ты был рожден в оковах, в темнице, которую ты не чувствуешь. Это тюрьма для твоего разума. К несчастью, никому нельзя объяснить, что такое windows. Ты должен посмотреть на это сам. Это твой последний шанс. Потом назад дороги не будет. Ты выбираешь синюю таблетку, все это заканчивается, и ты просыпаешься в своей постели и веришь в то, во что хочешь поверить. Ты выбираешь красную таблетку, и остаешься в стране чудес. Я покажу тебе, насколько глубока эта заячья нора. И помни, что я лишь предлагаю тебе правду, не более того..." -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| WinMain |
|
|||
|
Unregistered |
В принципе ничего не мешает и в C++ Builder создать новый файл Hello.cpp и набить в нем что-то типа:
#include <iostream.h> void main() { cout << "Hello!!!"; } Затем, войдя в консольный режим, скомпилировать это в командной строке bcc32 Hello (находясь в той директории, где сам исходный файл) В результате получится консольное Win32-приложение Hello.exe В командной строке наберите Hello.exe и увидите в ответ надпись Hello!!! |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
WinMain, почитай всю дискуссию внимательнее.
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
Цитирую NiJazz (самый первый вопрос):
Можно ли в C++ Builder использовать вызов main() как главную функцию (без define)? Я своим мини-примером ответил на этот вопрос. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Так ведь можно в Builder'е создать Console Application. И компилировать прям из IDE, без сложностей с командной строкой
|
|||
|
||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Правильно ли я понимаю, что в консольном приложении за создание окна ответственен CRT?
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
И да, и нет. Да - в том смысле, что кое-что для появления окна консоли (если оно ещё не на экране) делается в CRT. А нет - в том смысле, что это не то, что ты, по-моему, думаешь. Там нет ни CreateWindow или ShowWindow, и даже нет цикла обработки сообщений. Там используется одна единственная функция HANDLE GetStdHandle( DWORD ). Эта функция в зависимости от параметра возвращает дескриптор для стандартного устройства ввода - консоли (параметр STD_INPUT_HANDLE), вывода (STD_OUTPUT_HANDLE) или устройство вывода сообщений об ошибках (STD_ERROR_HANDLE). Но это дескриптор не окна, а устройства ввода/вывода (как у файлов).
Этот дескриптор можно использовать в ReadFile и WriteFile. P.S. Ах, да. Ещё есть функции AllocConsole и FreeConsole, смысл которых, я думаю, понятен из названия |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |