Включение исходного файла
Включает другой исходный файл в текущий исходный файл в строке сразу после директивы.
Синтаксис
#include < h-char-sequence > new-line | (1) | |
#include " q-char-sequence " new-line | (2) | |
#include pp-tokens new-line | (3) | |
__has_include ( " q-char-sequence " )__has_include ( < h-char-sequence > ) | (4) | (с C23) |
__has_include ( string-literal )__has_include ( < h-pp-tokens > ) | (5) | (с C23) |
| new-line | - | Символ новой строки |
| h-char-sequence | - | Последовательность одного или более h-charов, где появление любого из следующих приводит к неопределённому поведению:
|
| h-char | - | Любой член набора символов исходного текста за исключением новой строки и > |
| q-char-sequence | - | Последовательность одного или более q-charов, где появление любого из следующих приводит к неопределённому поведению:
|
| q-char | - | Любой член набора символов исходного текста за исключением новой строки и " |
| pp-tokens | - | Последовательность одного или более предварительных токенов |
| string-literal | - | Строковая константа |
| h-pp-tokens | - | Последовательность одного или более предварительных токенов, за исключением > |
Объяснение
include в директиве обрабатываются так же, как и в обычном тексте (то есть каждый идентификатор, в настоящее время определённый как имя макроса, заменяется его списком замещающих предварительных токенов). Результирующая директива после всех замен должна соответствовать одной из двух предыдущих форм. Способ объединения последовательности предварительных токенов между < и > предварительным токеном, или парой " символов в один предварительный токен имени заголовка определяется реализацией.__has_include равно 1 если поиск исходного файла успешен, и 0 если поиск не удался.В случае, если файл не найден, программа является ошибочной.
|
| (с C23) |
Примечания
Типичные реализации ищут только стандартные директории включения для синтаксиса (1). Стандартная библиотека C неявно включена в эти стандартные директории включения. Стандартные директории включения обычно могут быть настроены пользователем через параметры компилятора.
Цель синтаксиса (2) — поиск файлов, не управляемых реализацией. Типичные реализации сначала ищут директорию, в которой находится текущий файл, затем переходят к (1).
Когда файл включён, он обрабатывается фазами трансляции 1-4, которые могут включать, рекурсивно, расширение вложенных #include директив, до определённого реализацией лимита вложения. Чтобы избежать повторного включения одного и того же файла и бесконечной рекурсии, когда файл включает сам себя, возможно, транзитивно, обычно используются защиты заголовков: весь заголовок заключён в
#ifndef FOO_H_INCLUDED /* any name uniquely mapped to file name */ #define FOO_H_INCLUDED // contents of the file are here #endif
Многие компиляторы также реализуют нестандартный pragma #pragma once с аналогичным эффектом: он отключает обработку файла, если тот же файл (где идентификация файла определяется способом, специфичным для ОС) уже был включен.
Результат __has_include 1 только означает, что заголовок или исходный файл с указанным именем существует. Это не означает, что заголовок или исходный файл, при включении, не вызовут ошибку или будут содержать что-либо полезное.
Пример
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 6.4.7 Имена заголовков (с. 69)
- 6.10.1 Условное включение (с. 165-169)
- 6.10.2 Включение исходного файла (с. 169-170)
- Стандарт C17 (ISO/IEC 9899:2018):
- 6.10.2 Включение исходного файла (с. 119-120)
- Стандарт C11 (ISO/IEC 9899:2011):
- 6.10.2 Включение исходного файла (с. 164-166)
- Стандарт C99 (ISO/IEC 9899:1999):
- 6.10.2 Включение исходного файла (с. 149-151)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 3.8.2 Включение исходного файла
См. также
| Список заголовков стандартной библиотеки C | |
| Документация C++ для Включения исходного файла |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/preprocessor/include