Препроцессор Си

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Препроцессор C — макропрепроцессор для языков программирования C, Objective-C и C++.

Общая информация[править]

Препроцессор автоматически запускается компилятором C перед компиляцией. Он называется макропроцессором, потому что позволяет определять макросы, которые являются сокращенными идентификаторами для более длинных конструкций.

Во многих реализациях языка Си это отдельная программа, вызываемая компилятором в качестве первой части трансляции. Таким образом, на вход компилятора попадает текст, который может отличаться от того, который видит программист. Символ # (перед которым возможны символы-разделители) является знаком для препроцессора. Синтаксис таких строк не зависит от грамматики C, они могут появляться где угодно и не зависят от области видимости. Иногда препроцессор Си используется также для обработки других видов текстовых файлов.

Препроцессор языка Си предоставляет четыре отдельные возможности, которые вы можете использовать по своему усмотрению:

  1. Включение заголовочных файлов. Это файлы с декларациями, которые могут быть вставлены в вашу программу.
  2. Развертка макросов. Вы можете создать макросы, которые являются сокращениями для произвольных фрагментов языка Си, а затем препроцессор Си заменит макросы их определениями во всей программе.
  3. Условная компиляция. Используя специальные директивы препроцессирования, вы можете включать или исключать части программы в соответствии с различными условиями.
  4. Контроль строк. Если вы используете препроцессор для объединения или перестановки исходных файлов в промежуточный файл, вы можете управлять порядком строк (иногда используют кальку «порядок инклюдов»), и это в ряде случаев влияет на результат компиляции.

История[править]

Препроцессор появился в языке Си в 1973 году в связи с признанием полезности механизмов включения файлов, доступных в BCPL. Его первоначальная версия предлагала только включение файлов и простую замену строк с помощью #include и #define для макросов без параметров, соответственно. Вскоре она была расширена для включения макросов с аргументами и условной компиляции.

Включение файлов[править]

Одно из самых распространенных применений препроцессора — это включение другого файла:

#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}

Препроцессор заменяет строку #include <stdio.h> текстовым содержимым файла 'stdio.h', в котором, помимо прочего, объявлена функция printf().

В другом варианте синтаксиса используются двойные кавычки (например, #include "stdio.h"), это влияет на порядок поиска заголовка. Если имя файла заключено в угловые скобки, файл ищется в стандартных путях включения компилятора. Если имя файла заключено в двойные кавычки, то путь поиска расширяется и включает текущий каталог исходных файлов. Компиляторы языка Си и среды программирования имеют средства, позволяющие программисту определить, где можно найти включаемые файлы. Это может быть сделано с помощью флага командной строки, который может быть параметризован с помощью makefile, так что, например, для разных операционных систем может быть использован разный набор включаемых файлов.

По соглашению, включаемые файлы именуются с расширением .h или .hpp, но это не является обязательным требованием. Файлы с расширением .def могут обозначать файлы, предназначенные для многократного включения, каждый раз разворачиваясь в одно и то же повторяющееся содержимое; #include "icon.xbm", скорее всего, включает файл изображения XBM (который в то же время является исходным файлом C).

Как правило, #include подразумевает использование #include-guards («гарды») или директивы #pragma once для предотвращения двойного включения.

Условная компиляция[править]

Условная компиляция реализуется директивами if-else #if, #ifdef, #ifndef, #else, #elif и #endif. Варианты #ifdef и #ifndef являются простыми сокращениями для #if defined(…) и #if !defined(…).

#if VERBOSE >= 2
  printf("сообщение трассировки");
#endif

Между директивами #if и #endif допускается произвольное количество директив #elif и не более одной директивы #else. Если директива #else присутствует, то между ней и директивой #endif на данном уровне вложенности не должно быть других директив #elif.

Литература[править]

  • Richard M. Stallman The C Preprocessor (1992).
  • Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — М.: Вильямс, 2007. — С. 304. — ISBN 0-13-110362-8.
  • Гукин Д. Язык программирования Си для «чайников» = C For Dummies. — М.: Диалектика, 2006. — С. 352. — ISBN 0-7645-7068-4.

Ссылки[править]

 
Компиляторы

Borland Turbo CClangGCCLCCPelles CPCCTCCVisual C++ (C++/CLIC++/CX) • Watcom C/C++ compiler

Библиотеки

Стандартная библиотека языка СиglibcdietlibcuClibcNewlibEglibcBionic

Особенности

ОператорыC-строкаСинтаксисПрепроцессорЗаголовочные файлыТипы данныхФункции

Некоторые потомки

C++C#DObjective-CSwiftJavaAlef[en]LimboGoVala

C и другие языки

C и C++ (Совместимость[en]Операторы) • Сравнение Pascal и C[en]Компилятор C в байт-код Java

Категория Категория:Язык программирования Си

 
Используемые
в разработке

Ада A+ APL Atlast Forth AWL Язык ассемблера ActionScript ABAP/4 AutoIt AWK BeanShell Бейсик Си Кобол C++ C# Clarion Clojure ColdFusion Common Lisp D dBase Delphi DuAL Eiffel Erlang Euphoria F# Форт Фортран Gambas Go Groovy HAL/S Haskell IBM PL/S Icon IridiumJava JavaScript Limbo Lua Модула-3 Object Pascal Objective-C OCaml Oz Parser Паскаль Компонентный Паскаль Perl Pixilang PHP PowerBASIC Python ПЛ/1 Пролог Qi Ruby Scala Scheme Seed7 Smalltalk SQL PL/SQL Tcl TouchDesigner Vala Visual Basic (.NET) • X-Robot

Академические

Agda Clean Curry Idris Лого ML Оберон Planning C РЕФАЛ Симула

IEC 61131-3

Instruction List ST FBD Ladder Diagram (LD) • SFC

Прочие

Алгол Алгол 68 Модула-2 Миранда Hope НОРМИН Санда

Эзотерические

HQ9+/HQ9++ • INTERCAL Brainfuck Befunge Malbolge Piet Spoon Unlambda Whitespace FALSE LOLCODE Глагол

Визуальные

G (LabVIEW) • Microsoft VPL Sikuli VisSim Алиса ДРАКОН Скретч

Прочее

ДинамическиеКомпилируемыеС ключевыми словами не на английском языке С C-style синтаксисом СинтаксисYoptaScript

Категория Языки программирования

Runi.svg Одним из источников этой статьи является статья в википроекте «Руниверсалис» («Руни», руни.рф), называющаяся «Препроцессор Си».
Материал указанной статьи полностью или частично использован в Циклопедии по лицензии CC BY-SA.
Всем участникам Руниверсалиса предлагается прочитать «Обращение к участникам Руниверсалиса» основателя Циклопедии и «Почему Циклопедия?».