Подробности - #if !defined()

Конструкция типа (директива препроцессора)

#if !defined(MyClass_H)
	#define MyClass_H
......
#endif

Позволяет исключить двойные включения описания классов, и тем самым избежать ошибок типа error C2011, вот например таких:

--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
test.cpp
d:\project\test\myclass.h(6) : error C2011: 'MyClass' : 'class' type redefinition
Error executing cl.exe.

test.obj - 1 error(s), 0 warning(s)

Идея октлючения повторов заключена в операторе #define вот как можно сделать.

#define My 1

С этого момента существует понятие My это как константа. Везде где вы не поставите My при компиляции на её место будет поставлена единица (1). Наличие подобных определений можно проверять. Вот так:

#if defined(My)	// если определена My то что-то сделать
	......
#end if

Вот на основе этого механизма и действует предупреждения повторных включений. Создайте приложение Win32 console, как пустой проект (An empry project) с именем Test. Добавьте в проект файл Test.cpp и код его:

#include "myclass.h"
#include "myclass.h"


void main()
{
	MyClass my;
	my.GetInt(); 
}

Файл myclass.h и код к нему.

//#if !defined(MyClass_H)
//	#define MyClass_H

class MyClass
{
public:
	int GetInt();
	int intmy;
};

//#endif

Файл myclass.cpp и код к нему:

#include "myclass.h"

int MyClass::GetInt()
{
	return 1;
}

Запустите проект на компиляцию и выполнение, Вы получите ошибку о двойном включении класса.

А теперь раскомментируйте конструкции #if !defined в файле myclass.h и всё сработает.

Ну и что скажете Вы :-) да подобные ситуации видны. Современные каркасные библиотеки да и любая сложная структура классов часто требует перекрестных включений классов. Вот и думай потом как и что описывать, а подобным образом просто. Если класс описан, то он просто пропустится :-), а если нет, то описание будет включено. Подобные консрукции использует AppWizard для создаваемых приложений. Кроме того подобным образом можно работать с разными версиями классов. Например, сделать объявление константы, а при создании кода учитывать её установку.

Вот так проверяется в istream.h на тип операционной среды.

#if     !defined(_WIN32) && !defined(_MAC)
#error ERROR: Only Mac or Win32 targets supported!
#endif

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 31.12.99