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