/* */

понедельник, 26 января 2009 г.

post sp 4 update созданный с winlocalupdater (в архиве)
http://depositfiles.com/files/imtenjxim
еще один сборник
http://www.fixupdate.narod.ru/page2.html

среда, 14 января 2009 г.

от исходников С++/C к исполняемому файлу - Как все это работает?


Все началось вот с этого поста: http://www.gamedev.ru/code/forum/?id=90107
Ко мне пришла мысль - а сам я действительно представляю что происходит с исходниками, как они превращаются в программу ?
Попробую представить и записать на будущее это здесь:
Для наглядности возьмем код топикстартера:

./main.cpp

int main(int argc, char * argv[])
{
test *pTest = new test();
}

./resources.h

#ifndef RESOURCES_H_
#define RESOURCES_H_
#include
#endif

./test.cpp

class test
{
public:
test()
{
std::cout << "It works!"; } };



Это так называемые исходники, т.е. файлы содержащие исходный код программы. Если вставить это в соответствующие файлы .h .cpp и компилировать в каком либо ide (с точки зрения новичка - все делает именно ide, дальше я покажу что это не совсем так), то получим что? - правильно, кучу ошибок.
я использую mingw (порт на windows GCC), для других компиляторов сообщения будт отличаться, но если вы знаете английский хоть на минимальном уровне то обычно поймете что вам пытается сказать компилятор.
Compiling: main.cpp
E:\Code\aaa2s\a\main.cpp: In function `int main(int, char**)':
E:\Code\aaa2s\a\main.cpp:3: error: `test' was not declared in this scope
E:\Code\aaa2s\a\main.cpp:3: error: `pTest' was not declared in this scope
E:\Code\aaa2s\a\main.cpp:3: error: `test' is not a type
E:\Code\aaa2s\a\main.cpp:3: warning: unused variable 'test'
E:\Code\aaa2s\a\main.cpp:3: warning: unused variable 'pTest''
Чтобы понять в чем ошибка - углубимся в теорию.

Что представляет из себя исходный код - это набор комманд препроцессора и компилятора.
Прочитали ссылочки? - ничего не поняли, не беда - читаем дальше.
Что это значит ? - А то что исходный код должен быть обработан вначале препроцессором, а потом компилятором(они могут быть сделаны как одна программа или две разные, у нас первый случай)! Запустим только препроцессор(ключик -E) и
E:\Code\aaa2s\a>c:\MinGw\bin\mingw32-c++.exe -E main.cpp
# 1 "main.cpp"
# 1 ""
# 1 ""
# 1 "main.cpp"
int main(int argc, char * argv[])
{
test *pTest = new test();
}

Посмотрим что же получается с кодом после обработки его препроцессором
ну можно сказать что ничего с нашим примером не происходит, так как он практически не содержит комманд препроцессора, обычно начинающихся для с/c++ c знака #
(#include, #define и т.д.)
Но запомните - препроцессор - замена одного текста на другой исходя из комманд препроцессора. После того как препроцессор отработал и заменил текст в нужных местах, комманды препроцессора убираются из исходного текста - остаются команды для компилятора.
Что же делает дальше компилятор - он ищет свои ключевые слова ( ( , ) , * и т.д.) и в соответсвие с правилами языка разбирает препроцессированный исходный текст(синтаксический анализ, лексический анализ - не буду углубляться в то что знаю сам на уровне начинающего :) ). Одна неочень важная деталь - если какое слово не распознано как ключевое - то считается что это имя переменной (в общем случае, но контрпример - название функции - не ключевое слово но опознается именно как название функции потому что стоит там где по правилам языка должно стоять название функции, тоже самое с типом - оно узнается только потому что стоит там где должно стоять тип[TODO: чушь, переписать]). Ну это так - лирическое отступление.
Итак, посмотрим на ошибки:
E:\Code\aaa2s\a\main.cpp:3: error: `test' was not declared in this scope
Первая же ошибка нам говорит что компилятор не знает что за тип мы указали для переменной pTest, (он знает что это должен быть тип , потому что оно стоит там где по правилам должен стоять тип, но он не нашел его среди встроенных типов , таких как int , char и т.д.)
Соответсвенно мы должны подсказать ему что это за тип. Но как это сделать - если определение у нас в другом файле и компилятор почему то его не видит?