Spec-Zone.ru › GCC 5 CPP

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API