Глава 6
В этой главе...
Написание кодов программ может быть весьма увлекательным занятием. В набранные
формулы и выражения можно вложить самый разнообразный смысл, затем вывести все эти коды на печать и развеселить ими своих друзей. Например, с помощью команд и операторов можно перевести на язык программирования хорошо всем известные крылатые фразы. Если бы Шекспир был программистом, он мог бы написать что-то наподобие if(_2В)
{} else {}.
(А если бы он был толковым хакером, он написал бы _2В ?{}:{}.
)
Однако, если вы хотите, чтобы программа была действительно полезной и выполняла какие-то действия, одного лишь красивого текста недостаточно. Программу нужно откомпилировать. Компиляция программы — это преобразование исходных кодов программы, которые понятны программистам, в машинные коды, которые понятны компьютерам.
Процесс преобразования исходных кодов в машинные крайне сложен. Он требует точного сопоставления всех набранных вами инструкций (которые называются инструкциями высшего уровня) соответствующим инструкциям нижнего уровня (понятным компьютеру). Этот процесс завершается созданием выполняемой программы. Именно она может повлечь за собой какие-то реальные действия.
О процессе преобразования набранных программистами команд в машинные коды написано множество книг. К счастью для вас, разработчики, занимающиеся созданием компиляторов, все эти книги уже прочитали, поэтому вам вникать в различные тонкости этого процесса не нужно. У вас есть Visual C++, который сам откомпилирует набранные вами коды.
Процесс создания программы включает набор кодов, компиляцию и отладку. В большинстве случаев происходит также корректировка работы программы и добавление к ней новых возможностей, что влечет за собой многократную повторную компиляцию. К счастью, в Visual C++ компилировать программы очень просто. В действительности вы уже компилировали программу (и не один раз), если выполняли инструкции, описанные в главе 3.
Чтобы откомпилировать программу, откройте ее решение (solution). (Решения подробно описаны в главе 4.) Затем выберите команду Build->Build (Построить->Построить) или щелкните на кнопке Build одноименной панели (рис. 6.1).
Рис. 6.1. На этой панели расположены кнопки, которые запускают процесс компиляции
Visual C++ просматривает все исходные файлы открытого решения и преобразует их к
машинным кодам. В результате создается выполняемая программа. На экране вы не увидите никаких изменений, но теперь у вас уже есть реальная программа, которая хранится на жестком диске. Ее можно запустить на выполнение, скопировать на дискету и подарить кому-нибудь, а можно делать с ней все, что вы считаете нужным. (Только не предпринимайте ничего такого, что может повредить вашему здоровью или здоровью окружающих.)
Если вы хотите запустить программу, выберите команду Dedug->Start (Отладка->Запустить)
или щелкните на кнопке Start панели Dedug (рис. 6.2). Если вы уверены, что в программе нет ошибок (это равносильно тому, что вы считаете себя непревзойденным хакером), выберите команду Debug->Start Without Debugging (Отладка->Запустить без отладки), чтобы запустить программу без использования отладчика Visual C++.
Рис. 6.2. На этой панели есть кнопки для запуска,
остановки и пошагового выполнения программы
Если при написании кодов программы вы допустили какую-то ошибку, например передали функции неверное количество аргументов, неправильно набрали команду или присвоили недопустимое имя переменной, компилятор не сможет понять ваши коды и программа не будет откомпилирована.
Если это случится (правильнее сказать: когда это случится, поскольку случается это практически всегда), компилятор отобразит список синтаксических ошибок в окне Output, как показано на рис. 6.3. Синтаксическая ошибка в окне Output сопровождается сообщением о том, что вы что-то сделали неправильно. Дважды щелкните на этом сообщении, чтобы перейти к той строке кодов программы, где эта ошибка произошла. Чтобы программа была успешно откомпилирована, необходимо исправить все синтаксические ошибки.
РИС. 6.3. Сообщения о синтаксических ошибках, которые отображаются в окне Output
Одни ошибки очевидны и могут быть сразу же исправлены. Другие не так просты, и вам придется потратить немало времени, чтобы их обнаружить и исправить (особенно если у вас еще нет в этом большого опыта). Со временем вы научитесь быстро различать типичные ошибки и сразу же их исправлять.
Вот несколько правил, которые помогут вам в борьбе с ошибками.
Иногда в процессе компиляции помимо сообщений об ошибках вы можете сталкиваться
также с предупреждениями. Предупреждения появляются тогда, когда компилятор может правильно интерпретировать набранные вами коды, но считает, что выполнение таких кодов может привести к возникновению проблем. Например, если вы создаете переменную, но ни разу ее не используете, компилятор предупредит вас об этом и спросит, все ли здесь правильно. Или, что значительно хуже, вы можете начать использовать переменную еще до того, как присвоите ей какое-то значение. В этом случае на экране отобразится сообщение с предупреждением, подобное показанным на рис. 6.4.
РИС 6.4. Подобные предупреждения появляются на экране, если набранные вами коды могут привести к возникновению проблем
Относитесь к предупреждениям с должным вниманием. Хотя иногда они могут появляться как следствие чрезмерной осторожности компилятора, в большинстве случаев они помогают избежать многих неприятностей. Например, если вы забудете добавить строку, задающую начальное значение переменной, компилятор выдаст предупреждение. Если вы его проигнорируете, в процессе выполнения программы эта переменная будет принимать совершенно бессмысленные значения, в результате чего программа, разумеется, будет работать неправильно.
Хотя компилятору известно, где и какая ошибка произошла, он не знает, почему она произошла. Например, компилятор может установить, что в конце некоторой строки не хватает точки с запятой. Почему он ее просто не добавит? Потому что у этого могут быть разные причины. Вы могли просто забыть поставить точку с запятой, могли забыть набрать кроме этой точки с запятой еще какие-то коды или же могли вообще забыть выделить эту строку как комментарий.
Вместо того чтобы брать на себя ответственность и самостоятельно выбирать один из вариантов устранения ошибки, компилятор не пытается вместо вас создавать программу и только лишь указывает на ошибку, предоставляя вам право выбора дальнейших действий. Кроме того, поскольку круг вариантов исправления ошибки, а следовательно, и причин ее возникновения может быть довольно большим, компилятор иногда в состоянии только приблизительно указать на ошибку. Например, хотя компилятор может указать на некоторую строку и сказать, что здесь не хватает точки с запятой, на самом деле ошибка будет возникать из-за того, что точки с запятой не хватает в предыдущей строке.
При построении программы (команда Build->Build) обновляются файлы OBJ для всех измененных исходных файлов. Когда все файлы OBJ обновлены, программа компонуется для создания нового выполняемого файла (ЕХЕ). Результатом такой компиляции будет либо набор сообщений о синтаксических ошибках, либо полностью рабочая программа.
Если вы работаете над проектом и вносите изменения только в некоторые его части, используйте именно этот способ компиляции. При этом заново откомпилированы будут только измененные файлы и вам не нужно будет тратить массу времени и ждать, пока компилятор
сделает бессмысленную работу и еще раз откомпилирует те файлы, которые вы не трогали. Поэтому используйте команду Build-> Build, если вы внесли какие-то изменения в исходные файлы и вам нужен теперь новый файл ЕХЕ.
При обычной компиляции (команда Build->Compile) компилируется только тот файл, который открыт в данный момент для редактирования. Этой командой не создается рабочая программа. Используйте ее в том случае, если хотите проверить какой-либо исходный файл на наличие синтаксических ошибок. Если компиляция проходит успешно, создается объектный файл (OBJ).
При повторном построении (команда Build-> Rebuild All) все файлы проекта компилируются и затем компонуются для создания выполняемой программы (ЕХЕ). Как и в случае с построением, результатом такой команды будет либо набор сообщений о синтаксических ошибках, либо полностью рабочая программа. Даже если вы только что построили программу, при повторном построении каждый отдельный файл компилируется заново. (Результатом такой операции будут обновленные объектные файлы всех исходных файлов плюс выполняемый файл программы, созданный путем компоновки всех объектных файлов.) Используйте эту команду в том случае, если хотите быть уверены, что весь проект был построен заново.
Назад |
Начало урока |
Вверх |
Вперед
Содержание