на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Реферат: Препроцессор языка C.


текст не является С кодом. Для этого используются обычные С комментарии.

Директива '#if 0' должна состоять из правильных лексем.

     5.4.  Условия и макросы

     Условия часто используются вместе с макросами или утверждениями, так

как они являются единственными выражениями, чьи значения могут варьироваться

при компиляции. Директива '#if', не использующая макросы или утверждения,

является эквивалентом директиве '#if 1' или  '#if 0'.

     Например, рассмотрим условие, проверяющее выражение 'BUFSIZE == 1020',

где 'BUFSIZE' является макросом.

     #if BUFSIZE == 1020

       printf ("Large buffers!\n");

     #endif /* BUFSIZE is large */

     При программировании часто требуется определить размер переменной или

тип данных в директиве '#if', но препроцессор не обрабатыват такие операторы

как 'sizeof' или ключевые слова как 'int'.

     В директиве '#if' применяется специальный оператор 'defined',

используемый для проверки соответствия указанного имени существующему

макросу. В любом случае, значением выражения 'defined NAME' или

'defined (NAME)' является 1, если в данном месте программы определен макрос

с именем NAME, в противном случае значением выражения будет 0. Для оператора

'defined' имеет значение не определение макроса, а то что оно есть.

Рассмотрим пример:

     #if defined (vax) || defined (ns16000)

     Здесь значением выражения будет истина, если как имя 'vax', так и

'ns16000' определены как макросы. То же самое можно выполнить с помощью

утверждений:

     #if #cpu (vax) || #cpu (ns16000)

     Если макрос был определен, а затем уничтожен с помощью директивы

'#undef', то последующее применение оператора 'defined' возвратит значение

0, так как это имя больше не определено. Если же макрос заново определен

директивой '#define', то оператор 'defined' возвратит значение 1.

     Условия, проверяющие определение одного имени довольно часто

используются, поэтому для этой цели существует две дополнительные условные

директивы.

'#ifdef NAME'

     что является эквивалентом '#if defined (NAME)'.

'#ifndef NAME'

     что является эквивалентом '#if ! defined (NAME)'.

     Макроопределения могут меняться при разных процессах компиляции по

некоторым причинам.

     Некоторые макросы являются заранее определенными, в зависимости от

типа используемого компьютера. Например, на компьютерах Vax, имя 'vax'

является заранее определенным макросом. На других компьютерах оно не

определено.

     Большое количество макросов определяется системными подключаемыми

файлами. На различных системах и компьютерах определяются разные макросы с

разными значениями. Очень часто полезно проверять эти макросы условными

конструкциями во избежание использования аппаратных возможностей на

компьютере, где они не реализованы.

     Макросы являются простым способом настройки пользователями программы

для различных систем или приложений. Например, макрос 'BUFSIZE' может быть

определен в конфигурационном файле программы, который вкючается в качестве

подключаемого файла в каждый исходный файл. Можно использовать макрос

'BUFSIZE' в условии препроцессора для генерации кода, зависящего от

выбранной конфигурации.

     Макросы могут определяться или уничтожаться с помощью опций

препроцессора '-D' и '-U' при компиляции программы. Можно сделать так, что

один и тот же исходный файл будет скомпилирован в две различные программы

путем определения нужного макроса, использования условий для проверки

значения этого макроса и передачи значения макроса через опции компилятора.

     Утверждения обычно являются заранее определенными, но они также могут

быть определены с помощью директив или опций препроцессора.

     5.5.   Утверждения

     "Утверждения" являются более систематической альтернативой макросам

при создании условий на проверку типа компьютера или системы, используемой

при компиляции программы. Утверждения обычно определены заранее, хотя они

могут быть также определены директивами препроцессора или с помощью опций.

     Обычно макросы не классифицируются каким-либо образом по их определению.

Они могут указывать на архитектуру модели компьютера, отдельную модель

компьютера, на операционную систему, ее версию или на специфические

возможности конфигурации. Все это может сочетаться в одном макросе. В

отличие от макросов, утверждения состоят из четко поставленного вопроса и

ответа на него. Вопрос обычно называется "утверждением". Утверждение

выглядит следующим образом:

     #PREDICATE (ANSWER)

     Для имени PREDICATE следует использовать правильно сформированный

идентификатор. Значением ANSWER может быть любая последоватльность слов.

Здесь все символы являются значимыми, за исключением пробелов, расположенных

в начале и в конце ANSWER. Различия в пробелах в середине значения

игнорируются. Не разрешается использовать символ ')' в значении ANSWER.

     Далее приведен пример условия, проверяющего является ли ответ ANSWER

утверждением PREDICATE:

     #if #PREDICATE (ANSWER)

     Для одного утверждения может существовать несколько ответов. Если ответ

упущен при определении утверждения, то следует проверять, существует ли

у данного утверждения какой-нибудь ответ:

     #if #PREDICATE

     Большинство проверяемых утверждений являются заранее определенными.

GNU C предоставляет три заранее определенных утверждения: 'system', 'cpu'

и 'machine'. Утверждение 'system' используется для описания типа операционной

системы, 'cpu' - для описания архитектуры компьютера, а 'machine'

предоставляет дополнительную информацию о компьютере. Например, в системе

GNU будут верны следующие утверждения:

     #system (gnu)

     #system (mach)

     #system (mach 3)

     #system (mach 3.SUBVERSION)

     #system (hurd)

     #system (hurd VERSION)

а также возможно и другие. Альтернативные утверждения с более или менее

подробной информацией о версии системы помогут получить ответ на вопрос о

типе операционной системы.

     В системе Unix существует утверждение '#system (unix)', а возможно

одно из следующих: `#system (aix)', `#system (bsd)', `#system (hpux)',

`#system (lynx)', `#system (mach)', `#system (posix)', `#system (svr3)',

`#system (svr4)', или `#system (xpg4)' вероятно с последующей информацией

о версии системы.

     Другие значения для 'system' это '#system (mvs)' и '#system (vms)'.

     Многие Unix С компиляторы предоставляют только один ответ на

утверждение 'system': '#system (unix)', если они вообще используют

утверждения.

     Утверждение, ответ которого сосотоит из нескольких слов сильно

отличается от утверждений с ответом из одного слова. Например, утверждение

'system (mach 3.0)' не означает, что 'system (3.0)' - верно. Это также не

всегда означает, что 'system (mach)' тоже верно, но в GNU C последнее

утверждение может быть использовано.

     В настоящий момент возможные значения утверждений для 'cpu' являются

'#cpu (a29k)', `#cpu (alpha)', `#cpu (arm)', `#cpu (clipper)', `#cpu

(convex)', `#cpu (elxsi)', `#cpu (tron)', `#cpu (h8300)', `#cpu

(i370)', `#cpu (i386)', `#cpu (i860)', `#cpu (i960)', `#cpu (m68k)',

`#cpu (m88k)', `#cpu (mips)', `#cpu (ns32k)', `#cpu (hppa)', `#cpu

(pyr)', `#cpu (ibm032)', `#cpu (rs6000)', `#cpu (sh)', `#cpu (sparc)',

`#cpu (spur)', `#cpu (tahoe)', `#cpu (vax)', `#cpu (we32000)'.

     В С программе можно создавать свои утверждения с помощью директивы

'#assert' следующим образом:

     #assert PREDICATE (ANSWER)

(следует заметить отсутствие симола '#' перед PREDICATE.)

     При каждом выполнении этой директивы создается новый правильный ответ

для PREDICATE. При утверждении одного ответа предыдущие значения остаются в

силе. Единственный способ удалить утверждение - использовать директиву

'#unassert'. Эта директива имеет такой же систаксис как и '#assert'. Можно

удалить все утверждения для PREDICATE следующим образом:

     #unassert PREDICATE

     Также имеется возможность добавления или удаления утверждений с

помощью опций при вызове 'gcc' или 'cpp'.

     5.6. Директивы '#error' и '#warning'

     Директива '#error' вынуждает препроцессор сделать отчет о фатальной

ошибке. Все что следует после '#error' используется для сообщения.

     Директива '#error' в теле условия, проверяющего комбинацию параметров,

не до конца поддерживаемых программой, используется для сообщения о

возможной ошибке. Например, если известно, что программа не совсем корректно

выполняется на системе Vax, то можно написать:

     #ifdef __vax__

     #error Won't work on Vaxen.  See comments at get_last_object.

     #endif

     Если имеется несколько конфигурационных параметров, которые должны

быть указаны соответствующим образом при установке, можно использовать

условия для определения несоответствия и выдать сообщение об ошибке.

Например,

     #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \

         || HASH_TABLE_SIZE % 5 == 0

     #error HASH_TABLE_SIZE should not be divisible by a small prime

     #endif

     Директива '#warning' аналогична директиве '#error', но приводит к тому,

что препроцессор выдает предупреждающее сообщение и  продолжает обработку.

Все что, что следует после '#warning' используется для сообщения.

     Эту директиву можно использовать в устаревших подключаемых файлах с

указанием на новую версию файла.

     6. Комбинирование исходных файлов

     Одна из основных задач С препроцессора - это передача информации

компилятору о месторасположении различных частей программы.

     Код программы может формироваться из нескольких исходных файлов при

использовании директивы '#include'. Применение как директивы '#include',

так и условий с макросами приводит к изменению основного исходного файла.

Следует принимать во внимание значение нумерации строк С компилятором

(при сообщениях об ошибках) и отладчиком (например, GDB).

     В С препроцессоре существует директива, позволяющая контролировать эту

возможность. Это может пригодиться в случае, если файлом ввода препроцессора

является файл вывода другой программы, такой как 'bison', которая

обрабатывает другой файл, являющийся основным исходным файлом. При подобной

обработке нумерация строк теряется.

     Для устранения этого недостатка используется директива '#line', которая

позволяет указать номер строки реального исходного файла вместе с его именем.

Директива '#line' применяется в трех модификациях:

'#line LINENUM'

     Здесь LINENUM это десятичная целая константа, указывающая, что следующая

строка является строкой исходного файла с номером LINENUM.

'#line LINENUM FILENAME'

     Здесь LINENUM это десятичная целая константа, а FILENAME - строковая

константа, указывающая, что следующая строка является строкой исходного

файла с именем FILENAME, а ее номер - LINENUM. Значение FILENAME должно

быть заключено в двойные кавычки.

'#line ANYTHING ELSE'

     Значение ANYTHING ELSE проверяется на наличие макро вызовов, которые

затем подставляются. Результатом должна быть десятичная целая константа,

за которой может следовать стороковая константа, как это рассмотрено выше.

     Директива '#line' изменяет значения заранее определенных макросов

'__FILE__' и '__LINE__'.

     Вывод препроцессора (который затем перенапрвляется в компилятор)

содержит директивы, подобные '#line', только они начинаются с символа '#',

в отличие от '#line', за которыми следует номер строки и имя файла.

     7. Другие директивы препроцессора

     В этом разделе рассматриваются три дополнительные директивы. Они

описываются для полноты и не являются часто используемыми.

     "Пустая директива" состоит из символа '#', за которым следует символ

новой строки, причем между ними могут быть только пробелы (включая

комментарии). Пустая директива рассматривается как директива препроцессора и

не влияет на общий вывод. Основным значением этой директивы является то,

при обработке строки, содержащей символ '#', на вывод ничего не передается,

в отличие от выводимой строки, содержащей '#'.

     Стандарт ANSI указывает, что директива '#pragma' имеет произвольное

значение, устанавливаемое при разработке. В препроцессоре GNU C она

не используется, за исключением значения '#pragma once'. Однако, она

остается при выводе препроцессора и может быть использована в процессе

компиляции.

     Директива '#ident' используется для совместимости с некоторыми

системами. За ней следует строка с текстом. На некоторых системах этот

текст копируется в отдельное место объектного файла. Но в большинстве систем

он просто игнорируется и применение этой директивы не дает никакого эффекта.

В действительности, эта директива является единственной директивой,

используемой в подключаемых файлах и функционирует на тех системах,

которые ее поддерживают.

     8. Вывод С препроцессора

     Вывод С препроцессора выглядит примерно так же, как и ввод, только

все строки с директивами заменяются на пустые и комментарии заменяются

пробелами. Пробелы в середине строки не меняются. Однако пробел вставляется

после большинства макроподстановок.

     Имя исходного файла и информация о номере строки передается в строках

следующей формы:

     # LINENUM FILENAME FLAGS

которые вставляются в середину вводимого файла (но не в строчную или

символьную константу). Появление такой строки означает, что следующая

строка содержится в файле FILENAME и имеет порядковый номер LINENUM.

     После имени файла следует нуль или более флагов, значения которых

могут быть '1', '2', '3' или '4'. Если флагов более одного, то они

разделяются пробелами. Далее следует описание этих флагов.

'1'

     Указывает на начало нового файла.

'2'

     Указывает на возврат в файл (после включения другого файла).

'3'

     Указывает на то, что следующий текст исходит из системного

подключаемого файла, поэтому должны использоваться специальные

предупреждающие сообщения.

'4'

     Указывает на то, что следующий текст должен рассматриваться как С код.

     9. Вызов GNU С Препроцессора

     Обычно нет необходимости вызывать С препроцессор отдельно: он вызывается

автоматически С компилятором. Однако иногда требуется запустить препроцессор

без компилятора.

     С препроцессор запрашивает два имени файла в качестве аргументов. Один

из них является входным файлом, а другой - выходным. Препроцессор считыват

входной файл вместе с другими файлами, указанными директивой '#include'.

Получаемые при обработке данные поступают в выходной файл.

     Как входным так и выходным файлами может быть параметр '-'. Если он

указан вместо имени входного файла, то все данные считываются со стандартного

ввода, если же он указан вместо выходного файла, то все выходные данные

поступают на стандартый вывод. Также если имя выходного файла или оба имени

файла опущены, то для ввода и вывода вместо отсутствующих имен файлов

используется стандартный ввод и вывод.

     Далее следует список опций, используемых С препроцессором. Эти опции

также могут быть указаны при компиляции программ, так как они автоматически

передаются препроцессору при вызове компилятора.

'-P'

     Предотвращает генерацию строк, начинающихся с символа '#', вместе с

номером строки. Это может быть полезно при обработке препроцессором

какого-либо текста, не являющегося С программой.

'-C'

     Не удаляет комментарии и передает их в выходной файл. Комментарии в

аргументах макросов поступают на вывод перед подстановкой макросов.

'-traditional'

     Иммитирует работу более ранней версии препроцессора, что

противопоставляется стандарту ANSI C.

     При макроподстановках игнорируется наличие символов двойной

и одинарной кавычки. Имя макроаргумента заменяется на его значение, даже

если он является строчной или символьной константой.

     Значение макроса может завершаться в середине строковой или символьной

константы. Константа завершается в тексте программы после макроподстановки.

     Конец строки завершает строковую или символьную константу без сообщения

об ошибке.

     Комментарии заменяются пустым значением. (В ANSI C комментарии

заменяются пробелом.)

     Не производится обработка чисел. Значение '1.0e+4' рассматривается как

три значения: '1.0e', '+' и '4'.

     Не запрещается использование макросов в их макроопределениях. Поэтому

использование любого рекурсивно заданного макроса неизбежно приводит к

ошибке.

     Символ '#' не имеет какого-либо специального значения в

макроопределении.

     Текст программы, находящийся в конце значения макроса может выполняться

вместе с текстом, находящимся после вызова макроса, образуя единую

конструкцию, что невозможно в ANSI C.

     Символ '\' в макроаргументе указывает на синтаксический смысл следующего

символа.

'-trigraphs'

     Обработка последовательностей trigraph стандарта ANSI. Это

последовательности, состоящие из трех символов и начинающиеся со строки '??'.

Они определены стандартом ANSI C для обозначения отдельных символов.

Например, значением '??/' является '\', поэтому значением ''??/n'' будет

символьная константа, вкючающая символ перевода строки. GNU C препроцессор

не поддерживает все программы в стандарте ANSI C, пока не указана опция

'-trigraphs'.

'-pedantic'

     Выдаются предупреждающие сообщения в соответствии со стандартом ANSI C,

например в случаях, если какой-либо другой текст кроме комментариев стоит

после директив '#else' или '#endif'.

'-pedantic-errors'

     То же, что и '-pedantic', только выдаются сообщения об ошибках, вместо

предупреждений.

'-Wtrigraphs'

     Выдается предупреждение, если обнаруживается trigraph

последовательность (предполагается, что указана опция '-trigraphs').

'-Wcomment'

     Выдается предупреждение, если обнаруживается последовательность '/*'

внутри комментария.

'-Wall'

     То же, что и '-Wtrigraphs' и '-Wcomment' (но не '-Wtraditional').

'-Wtraditional'

     Выдается предупреждение, если встречаются отдельные конструкции,

имеющие различия в обычном и в ANSI C.

'-I DIRECTORY'

     Имя каталога DIRECTORY добавляется к началу списка каталогов, где

производится поиск подключаемых файлов. Это может быть использовано для

вставки нестандартного подключаемого файла со стандартным именем, потому

как эти каталоги просматриваются перед системными каталогами с подключаемыми

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

просматриваются слева направо, затем просматриваются системные каталоги.

'-I-'

     Все каталоги, указанные опцией '-I' до указания опции '-I-'

просматриваются только при выполнении директивы '#include "FILE"' и не

используются директивой '#include <FILE>'.

     Если после опции '-I-' указаны дополнительные каталоги опцией '-I', то

эти каталоги используются всеми директивами '#include'.

     При использовании опции '-I-', текущий каталог не просматривается в

первую очередь директивой '#include "FILE"'. Поэтому текущий каталог

просматривается только в случае его указания опцией '-I.'. Если указать обе

опции '-I-' и '-I.' то можно проследить, какие каталоги просматриваются до

текущего, а какие - после.

'-nostdinc'

     Стандартные системные каталоги не используются для поиска подключаемых

файлов. Используются только каталоги, указанные опциями '-I' (а также

текущий каталог, если он указан).

'-nostdinc++'

     Не производится поиск подключаемых файлов в стандартных каталогах С++,

а для поиска используются остальные стандартные каталоги. (Эта опция

применяется при построении библиотеки libg++.)

'-D NAME'

     Определяется макрос с именем NAME и значением '1'.

'-D NAME=DEFINITION'

     Определяется макрос с именем NAME и значением DEFINITION. Не существует

никаких ограничений на значение DEFINITION, но если препроцессор вызывается

из оболочки или подобной программы, то следует использовать специальный

синтаксис для предотвращения передачи символов со специальным значением,

таких как пробелы, оболочке. Если передается более чем один параметр '-D'

для одного и того же значения NAME, то используется значение, стоящее

правее всех.

'-U NAME'

     Макрос с именем NAME не определяется. Если передаются оба параметра

'-U' и '-D' для одного имени, то макрос не определяется, так как приоритет

параметра '-U' выше.

'-undef'

     Все нестандартные макросы не определяются.

'-A PREDICATE(ANSWER)'

     Создается утверждение с именем PREDICATE и значением ANSWER.

     Возможно использование опции '-A-' для предотвращения создания всех

утверждений. Эта опция также уничтожает все макросы, указывающие на тип

используемой системы.

'-dM'

     Вместо вывода результата обработки, выводится список директив '#define'

для всех определенных макросов при работе препроцессора, включая заранее

определенные макросы. Это позволяет выяснить определения всех макросов в

используемой версии препроцессора. Предполагая, что файл 'foo.h' не

существует, следующая команда

          touch foo.h; cpp -dM foo.h

выявит значения всех заранее определенных макросов.

'-dD'

     То же, что и '-dM' за исключением двух аспектов: заранее определенные

макросы не включаются и выводятся как все директивы '#define', так и

результат обработки. Весь вывод поступает в стандартный файл вывода.

'-M [-MG]'

     Вмето вывода результата обработки, выводится информация в формате

команды 'make', описывающая зависимости основного исходного файла.

Препроцессор выводит информацию для 'make', которая включает в себя имя

объектного файла для данного исходного файла, запятую, и имена всех

подключаемых файлов. Если подключаемых файлов довольно большое количество,

то строка разбивается на несколько с помощью последовательности

'\'-newline.

     Опция '-MG' указывает, что отсутствующие подключаемые файлы являются

генерируемыми файлами и предполагается что они находятся в одном каталоге

с исходными файлами. Она должна быть указана вместе с опцией '-M'.

     Эта возможность используется для автоматического обновления make-файлов.

'-MM [-MG]'

     То же, что и '-M', только используются файлы, указываемые директивой

'#include "FILE"'. Системные подключаемые файлы, указываемые директивой

'#include <FILE>', не используются.

'-MD FILE'

     То же, что и '-M', только вся информация записывается в файл с именем

FILE. Используется в дополнение к стандартной компиляции файла. При указании

этой опции не запрещается стандартная компиляция в отличие от опции '-M'.

     При вызове gcc аргумент FILE не указывается. Gcc создает файлы путем

замены ".c" на ".d" в конце имени исходного файла.

     При использовании Mach возможно применение утилиты 'md' для объединения

нескольких файлов в один, который затем можно использовать с командой 'make'.

'-MMD FILE'

     То же, что и '-MD' за исключением того, что используются подключаемые

файлы пользователя, а не системные подключаемые файлы.

'-H'

     Выводятся имена всех используемых подключаемых файлов.

'-imacros FILE'

     Обработка файла FILE в качестве ввода вне зависимости от вывода перед

обработкой стандартного входного файла. Так как вывод при обработке файла

FILE не используется, то единственным применением этой опции является

определение макросов в файле FILE для их последующего использования при

обработке исходного файла.

'-include FILE'

     Обработка файла FILE в качестве входного с последующим включением

всех данных, полученных при обработке, в основной входной файл перед его

обработкой.

'idirafter DIR'

     Имя каталога DIR добавляется ко второму пути поиска подключаемых файлов.

Каталоги, указанные во втором пути, просматриваются в том случае, если

требуемый подключаемый файл не был найден в каталогах, указанных в основном

пути поиска (он задается опцией '-I').

'-iprefix PREFIX'

     Определяет значение PREFIX, как префикс для последующих опций

'-iwithprefix'.

'-iwithprefix DIR'

     Имя каталога DIR добавляется ко второму пути поиска подключаемых файлов.

Имя каталога создается путем объединения значений PREFIX и DIR, где значение

PREFIX дополнительно указывается опцией '-iprefix'.

'-isystem DIR'

     Каталог DIR добавляется в начало второго пути поиска подключаемых

файлов, помечая его как системный каталог. Таким образом, этот каталог

используется также как и стандартные системные каталоги.

`-lang-c'

`-lang-c89'

`-lang-c++'

`-lang-objc'

`-lang-objc++'

     Указывается язык исходного файла. Опция '-lang-c' указывается по

умолчанию. Она допускает использование комментариев С++ (комментарии,

начинающиеся со строки '//' изаканчивающиеся в конце этой строки). Опция

'-lang-c89' запрещает использование комментариев С++. При указании опции

'-lang-c++' обрабатываются комментарии С++ и используются дополнительные

каталоги для подключаемых файлов С++. Опция '-lang-objc' допускает

использование директивы объектного С '#import'. Опция '-lang-objc++'

использует все возможности расширений объектного С и С++.

     Эти опции создаются драйвером компилятора 'gcc', но не передаются

через командную строку при вызове 'gcc' до тех пор пока не будет указана

опция драйвера '-Wp'.

'-lint'

     Производится поиск команд, заключенных в комментарии, для программы

проверки 'lint' с их последующим включением в текст программы с префиксом

'#pragma lint'. Например, комментарий '/* NOTREACHED */' после обработки

препроцессором становится строкой '#pragma lint NOTREACHED'.

     Использование этой опции возможно только при прямом вызове 'cpp'.

'gcc' не передает эту опцию из своей командной строки.

'-$'

     Запрещается использование символа '$' в идентификаторах. Это

используется для согласования со стандартом ANSI. 'gcc' автоматически

передает эту опцию препроцессору при указании опции '-ansi', но сам 'gcc'

не распознает опцию '-$'. Ее нужно указать препроцессору отдельно для ее

применения без дополнительного воздействия опции '-ansi'.


Страницы: 1, 2, 3, 4


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.