![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Подробности - #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 | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|