19 Preprocessing directives [cpp]

19.2 Source file inclusion [cpp.include]

#include Директива должна определить заголовок или исходный файл , который может быть обработан реализацией.

Директива предварительной обработки формы

# include < h-char-sequence > new-line

ищет последовательность выполнения определенных мест для заголовка определен однозначно указанной последовательностью между < и > разделителями, и приводит к замене этой Директивы всего содержимого заголовка. То, как указываются места или идентифицируется заголовок, определяется реализацией.

Директива предварительной обработки формы

# include " q-char-sequence " new-line

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

# include < h-char-sequence > new-line

с идентичной содержащейся последовательностью (включая > символы, если они есть) из исходной директивы.

Директива предварительной обработки формы

# include pp-tokens new-line

(что не соответствует ни одной из двух предыдущих форм) разрешено. Маркеры предварительной обработки после include в директиве обрабатываются так же, как и в обычном тексте (т. Е. Каждый идентификатор, определенный в настоящее время как имя макроса, заменяется его списком замены токенов предварительной обработки). Если директива, полученная после всех замен, не соответствует одной из двух предыдущих форм, поведение не определено.147 Метод, с помощью которого последовательность токенов предварительной обработки между a < и > парой токенов предварительной обработки или парой " символов объединяется в один токен предварительной обработки имени заголовка, определяется реализацией.

Реализация должна обеспечивать уникальные отображения для последовательностей, состоящих из одного или нескольких nondigits символов, digits за которыми следует точка (.) и один nondigit. Первый символ не должен быть digit. Реализация может игнорировать различия в алфавитном регистре.

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

[ Note: Хотя реализация может предоставлять механизм для предоставления произвольных исходных файлов доступным для < > поиска, в целом программисты должны использовать < > форму для заголовков, предоставленных с реализацией, и " " форму для источников, находящихся вне контроля реализации. Например:

#include <stdio.h>
#include <unistd.h>
#include "usefullib.h"
#include "myprog.h"

end note]

[ Example: Это иллюстрирует замененные #include макросами директивы:

#if VERSION == 1
    #define INCFILE  "vers1.h"
#elif VERSION == 2
    #define INCFILE  "vers2.h"  // and so on
#else
    #define INCFILE  "versN.h"
#endif
#include INCFILE

end example]

Обратите внимание, что смежные строковые литералы не объединяются в один строковый литерал (см. Этапы перевода в [lex.phases]); таким образом, раскрытие, которое приводит к появлению двух строковых литералов, является недопустимой директивой.