Какова цель заголовка features.h?

Какова цель заголовка features.h? Почему и когда это может быть использовано в моем коде?

Определяет ли он исходные функции, поддерживаемые системой? Или это определяет некоторые дополнительные вещи, которые должны быть определены в зависимости от других определений?

Ответ 1

Заголовочный файл features.h предоставляет различные определения макросов, которые указывают стандартное соответствие другим файлам заголовков, то есть какие функции (отсюда и название) должны быть включены или отключены в зависимости от того, какой стандарт пользователь хочет использовать.

Большинство компиляторов C/С++ имеют параметры командной строки для соответствия стандартам. Возьмем GCC в качестве примера: когда вы передаете параметр -std=gnu9x, вы запрашиваете диалект GNU стандарта C99. Заголовок features.h гарантирует, что все остальные заголовки, которые его включают, будут включать те или иные функции, которые необходимы для поддержки этого конкретного диалекта. Это достигается с помощью #define -ing или #undef с некоторыми "промежуточными" макросами.

В качестве бонуса features.h также предоставляет макросы с информацией о версии версии glibc, а также различные другие бит и бобы.

Ответ 2

В общем случае, если вам нужно использовать какие-либо переменные или функции, определенные в файле заголовка, вам необходимо включить его в свою программу. Это правило справедливо и для features.h. URL-адрес features.h приведен ниже:

http://repo-genesis3.cbi.utsa.edu/crossref/heccer/usr/include/features.h.html

Ответ 3

Из features.h Ссылка на файл

Определяет, следует ли включать варианты алгоритма. Меньшие варианты уменьшают размер исполняемого файла и время компиляции. Этот файл является параллельным расширением GNU для стандартной библиотеки С++.

Таким образом, этот файл будет содержать некоторый алгоритм, указанный на ссылочной странице.

Ответ 4

Я grepped POSIX 7, как описано в: https://unix.stackexchange.com/info/340285/install-the-latest-posix-man-pages/483198#483198 и нет хитов для features.h, так должно быть только расширением glibc.

В glibc 2.28 он присутствует в include/features.h.

Одной из интересных вещей, которые он определяет, являются макросы версии:

#include <stdio.h>
#include <features.h>

int main(void) {
  printf("__GLIBC__       %u\n", __GLIBC__);
  printf("__GLIBC_MINOR__ %u\n", __GLIBC_MINOR__);
  return 0;
}

Ubuntu 16.04, который имеет glibc 2.23, выводит:

__GLIBC__       2
__GLIBC_MINOR__ 23

Смотрите также: Проверьте версию glibc для определенного компилятора gcc

Кроме того, этот заголовок, кажется, включается в большинство/все заголовки glibc, что может позволить вам проверить, используется ли glibc: как определить, используется ли glibc, но TODO Я не смог найти документацию для этого.