Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17111 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 11:

Препроцессор языка Си

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >

Командная строка #include может встречаться в любом месте программы, но обычно все включения размещаются в начале файла исходного текста.

#include <имя_файла>

Пример:

#include <math.h>

Препроцессор заменяет эту строку содержимым файла math.h. Угловые скобки означают, что файл math.h будет взят из некоторого стандартного каталога (обычно это /usr/include ). Текущий каталог не просматривается:

#include "имя_файла"

Пример:

#include "ABC"

Препроцессор заменяет эту строку содержимым файла ABC. Так как имя файла заключено в кавычки, то поиск производится в текущем каталоге (в котором содержится основной файл исходного текста). Если в текущем каталоге данного файла нет, то поиск производится в каталогах, определенных именем пути в опции -l препроцессора. Если и там нет файла, то просматривается стандартный каталог.

В операционной системе UNIX угловые скобки сообщают препроцессору, что файл следует искать в одном или нескольких стандартных системных каталогах. Кавычки говорят ему, что сначала нужно смотреть в вашем каталоге или в каком-то другом, если вы определяете его именем файла, а затем искать в стандартных местах.

В конкретных реализациях количество и наименования заголовочных файлов могут быть разными:

#include <stdio.h>	ищет в системном каталоге
#include "my.h"         ищет в текущем рабочем 
                        каталоге
#include "/user/1/my.h"	ищет в каталоге /user/1

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

#include "stdio.h"	ищет на стандартном диске
#include <stdio.h>	ищет на стандартном диске
#include "a:stdio.h"	ищет на диске а

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

Некоторые файлы включены в систему, например, stdio.h, но можно создать и свой файл.

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

Условная компиляция

Командные строки препроцессора используются для условной компиляции различных частей исходного текста в зависимости от внешних условий.

#if константное_выражение

Пример:

#if ABC + 3

Истина, если константное выражение ABC + 3 не равно нулю.

#ifdef идентификатор

Пример:

#ifdef ABC

истина, если идентификатор ABC определен ранее командой #define.

#ifndef идентификатор

Пример:

#ifndef ABC

истина, если идентификатор ABC не определен в настоящий момент.

#else
 . . .
#endif

Если предшествующие проверки #if, #ifdef или #ifndef дают значение "Истина", то строки от #else до #endif игнорируются при компиляции.

Если эти проверки дают значение "Ложь", то строчки от проверки до #else (а при отсутствии #else - до #endif ) игнорируются.

Команда #endif обозначает конец условной компиляции.

Пример:

#ifdef DEBUG
fprintf (stderr, "location: x = %d\n", x);
#endif

Вспомогательные директивы

Номер строки и имя файла

#line целая_константа "имя_файла"

Пример:

#line 20 "ABC"

Препроцессор изменяет номер текущей строки и имя компилируемого файла. Имя файла может быть опущено.

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

Пример:

#define N 3/*определение константы */
void main( )
{
#line 55  "file.c"
double x[3*N];
}
< Лекция 10 || Лекция 11: 12345 || Лекция 12 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Андрей Савенков
Андрей Савенков
Россия, Узловая
Сергей Сивохо
Сергей Сивохо
Россия, г. Калининград