Spec-Zone.ru › GCC 13 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-13.3.0/cpp/Wrapper-Headers.html

Spec-Zone.ru

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