заменяется на содержимое файла с именем
Подобным же образом выполняется управляющая строка
#include "
Сначала поиск осуществляется по тем же правилам, по каким компилятор ищет первоначальный исходный файл (механизм этого поиска зависит от реализации), а в случае неудачи осуществляется методом поиска, принятым в #include первого типа. Результат остается неопределенным, если имя файла содержит ", \ или /*; использование знака > разрешается.
Наконец, директива
#include
не совпадающая ни с одной из предыдущих форм, рассматривает
Файлы, вставляемые с помощью
A12.5. Условная компиляция
Части программы могут компилироваться условно, если они оформлены в соответствии со следующим схематично изображенным синтаксисом:
#if
#ifdef
#ifndef
#elif
#else
Каждая из директив (
Константные выражения в
defined
и
defined (
на предмет наличия в них макровызова, они заменяются на 1L или 0L в зависимости от того, был или не был определен препроцессором указанный в них идентификатор. Все идентификаторы, оставшиеся после макрорасширения, заменяются на 0L. Наконец, предполагается, что любая целая константа всегда имеет суффикс L, т. е. вся арифметика имеет дело с операндами только типа
Константное выражение (A7.19) здесь используется с ограничениями: оно должно быть целочисленным, не может содержать в себе перечислимых констант, преобразований типа и операторов
Управляющие строки
#ifdef
#ifndef
эквивалентны соответственно строкам
#if defined
#if !defined
Строки
A12.6. Нумерация строк
Для удобства работы с другими препроцессорами, генерирующими Си-программы, можно использовать одну из следующих директив:
#line
#line
Эти директивы предписывают компилятору считать, что указанные десятичное целое и идентификатор являются номером следующей строки и именем текущего файла соответственно. Если имя файла отсутствует, то ранее запомненное имя не изменяется. Расширения макровызовов в директиве