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

Глобальные переменные С++

Сейчас я расскажу о том, как использовать глобальные переменные в пределах разных модулей. Пусть у нас будет переменная «Bar». Опишем её в модуле «vars.cpp». Желательно всегда описывать переменные в файлах «*.cpp»

(vars.cpp)
int bar;

(header.h)
void foo()
{
extern int bar;
bar++;
}

(main.cpp)
#include "header.h"

void main()
{
extern int bar;
bar = 4;
foo();
//bar == 5;
}

* This source code was highlighted with Source Code Highlighter.
Теперь, когда мы создаем переменную «extern int bar» в «main», она связывается с переменной, определенной в модуле «vars.cpp».
Так же и в случае метода foo() в header.h. При объявлении переменной, ее значение сразу будет равным 4.
На этом все.
После регистрации блога автор сабжа безнадёжно свалил на луркмор и читал архивы копипасты.

Однако, хорошо сейчас рассказать, что изменилось за целый день знакомства и написания кода в Visual Studio.

Применен объектно-ориентированый подход к релизации движка. Программа распалась на модули и заголовки.

Обнаружена интерестная особенность компилятора.
Например код
(a.h)
class a
{
foo()
{
//bar
}
}

(b.h)
#include "a.h"

class b
{
b()
{
//foo
}
}

(main.cpp)
#include "a.h"
#include "b.h"

int main()
{
return 0;
}


Отказывается компилироваться, из-за двойного «#include "a.h"» как в «b.h» так и в «main».
Лечится это при помощи директив препроцессора.

#ifndef FOO_H
#define FOO_H
class foo
{
bar()
{
//...
}
}
#endif

Наш предведущий код приймет вид:

(a.h)
#ifndef A_H
#define A_H
class a
{
foo()
{
//bar
}
}
#endif

(b.h)
#ifndef B_H
#define B_H
#include "a.h"

class b
{
b()
{
//foo
}
}
#endif

(main.cpp)
//Теперь при включении заголовочного файла, «а.h» и «b.h», куски кода, которые находятся внутри директивы #ifndef→#define→...→#endif, будут включены только один раз во время компиляции.
#include "a.h"
#include "b.h"

int main()
{
return 0;
}

Без этих директив, компилятор будет выдавать ошибку «Class A redefenitial error», или что-то в этом роде.

udp: Стоит отметить, что при вызове препроцесорных директив ощутимо падает скорость компиляции.

Начало разработки.

После очередного ночного полу-кошмара было решено разрабатывать 3d-игру.
Жанр: Симулятор машиниста в метро.

Похожие проекты:

Рабочее название проекта не определенно. Рабочее название движка — «sEngine», расшифровывается как Subway Engine.

После небольшой паузы, я расскажу что ждет начинающих разработчиков игр, в связке C++ + DirectX10 + Visual Studio 2008.