Подтвердить что ты не робот

Зачем использовать #include_next в проекте?

Чтобы указать документацию iOS на заголовках Wrapper:

#include_next не различает <file> и "файл", а также не проверяет, что указанный вами файл имеет одинаковый имя как текущий файл. Он просто ищет файл с именем, начиная с каталогом в пути поиска после того, где текущий файл был найден.

Использование `#include_next 'может привести к большой путанице. Мы рекомендуем он будет использоваться только тогда, когда нет другой альтернативы. В частности, это не должны использоваться в заголовках, относящихся к конкретной программе; Это следует использовать только для внесения глобальных поправок в соответствии с fixincludes.

Итак, два вопроса, что такое #include_next, и почему вам когда-нибудь понадобится его использовать?

4b9b3361

Ответ 1

Используется, если вы хотите заменить заголовок по умолчанию одним из своих собственных решений, например, скажем, вы хотите заменить "stdlib.h". Вы бы создали файл stdlib.h в своем проекте, и это будет включено вместо заголовка по умолчанию.

#include_next используется, если вы хотите добавить некоторый материал в stdlib.h, а не полностью заменить его. Вы создаете новый файл stdlib.h, содержащий:

#include_next "stdlib.h"
int mystdlibfunc();

И компилятор не будет включать ваш stdlib.h снова рекурсивно, как в случае с простым #include, но скорее продолжит в других каталогах файл с именем "stdlib.h".

Ответ 2

Это удобно, если вы поддерживаете несколько версий чего-то. Например, я пишу код, поддерживающий PostgreSQL 9.4 и 9.6. Существует ряд внутренних изменений API, в основном новые аргументы существующих функций.

Заголовки совместимости и функции обертки

Я мог писать заголовки совместимости с static inline оберточными функциями с новыми именами для всего, в основном API-интерфейсом обертки, где я использую имя обертки во всем моем коде. Скажите something_compat.h с помощью:

#include "something.h"

static inline something*
get_something_compat(int thingid, bool missing_ok)
{
    assert(!missing_ok);
    return get_something(thingid);
}

но уродливо разбрасывать _compat или любые суффиксы везде.

Заголовок обертки

Вместо этого я могу вставить заголовок совместимости в путь включения при создании против старой версии, например. compat94/something.h:

 #include_next "something.h"

 #define get_something(thingid, missing_ok) \
 ( \
     assert(!missing_ok), \
     get_something(thingid) \
 )

поэтому остальная часть кода может просто использовать подпись 9.6. При построении против 9.4 мы будем префикс -Icompat94 в путь поиска заголовка.

Уход требуется для предотвращения множественной оценки, но если вы используете #include_next, вы явно не против полагаться на gcc. В этом случае вы также можете использовать выражения .

Этот подход удобен, когда новая версия является "первичной" целью, но обратная совместимость для более старой версии требуется в течение некоторого ограниченного периода времени. Таким образом, вы постепенно отказываетесь от устаревших версий и пытаетесь сохранить код чистым со ссылкой на текущую версию.

Альтернативы

Или быть разумным человеком, использовать С++ и использовать перегруженные функции и встроенные функции шаблонов: p