Spec-Zone.ru › GCC 10 CPP

Следующая: Заголовки системы, Предыдущая: Вычисленные включения, Вверх: Файлы заголовков [Оглавление][Указатель]

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

Spec-Zone.ru

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