2.7 Заголовки обёртки
Иногда необходимо изменить содержимое системного файла заголовка, не редактируя его напрямую. Например, операция fixincludes GCC делает это. Один из способов — создать новый файл заголовка с тем же именем и вставить его в путь поиска перед исходным заголовком. Это работает нормально, пока вы готовы полностью заменить старый заголовок. Но что, если вы хотите обратиться к старому заголовку из нового?
Вы не можете просто включить старый заголовок с помощью ‘#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-5.5.0/cpp/Wrapper-Headers.html