2.7 Заголовки оболочки
Иногда необходимо изменить содержимое предоставленного системой файла заголовка, не редактируя его напрямую. Например, операция GCC fixincludes выполняет это. Один из способов сделать это — создать новый файл заголовка с тем же именем и вставить его в путь поиска перед исходным заголовком. Это работает хорошо, пока вы готовы полностью заменить старый заголовок. Но что, если вы хотите сослаться на старый заголовок из нового?
Вы не можете просто включить старый заголовок с помощью ‘#include’. Это начнёт с самого начала и снова найдёт ваш новый заголовок. Если ваш заголовок не защищён от многократного включения (см. Заголовки, включаемые только один раз), это будет рекурсировать бесконечно и приведёт к ошибке.
Вы можете включить старый заголовок с абсолютным путём:
#include "/usr/include/old-header.h"
Это работает, но не является чистым; если системные заголовки когда-либо переместятся, вам нужно будет отредактировать новые заголовки, чтобы они соответствовали.
Нет способа решить эту проблему в рамках стандарта C, но вы можете использовать расширение GNU ‘#include_next’. Это означает «Включить следующий файл с этим именем». Эта директива работает как ‘#include’, за исключением поиска указанного файла: она начинает поиск в списке директорий файлов заголовков после директории, в которой был найден текущий файл.
Предположим, вы указываете -I /usr/local/include, и список директорий для поиска также включает /usr/include; и предположим, что оба каталога содержат signal.h. Обычное #include <signal.h> находит файл в /usr/local/include. Если этот файл содержит #include_next <signal.h>, он начинает поиск после этой директории и находит файл в /usr/include.
‘#include_next’ не различает <file> и "file" включения, а также не проверяет, что файл, который вы указываете, имеет то же имя, что и текущий файл. Она просто ищет файл с указанным именем, начиная с директории в пути поиска после той, в которой был найден текущий файл.
Использование ‘#include_next’ может привести к большой путанице. Мы рекомендуем использовать его только тогда, когда нет других альтернатив. В частности, его не следует использовать в заголовках, принадлежащих конкретной программе; его следует использовать только для внесения глобальных исправлений в духе fixincludes.
Далее: Системные заголовки, Предыдущий: Вычисленные включения, Вверх: Файлы заголовков [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/cpp/Wrapper-Headers.html