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