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