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-6.5.0/cpp/Wrapper-Headers.html