Время от времени вы можете застать себя на том, что просматриваете заголовочные файлы Linux. Скорее всего, вы найдете рад конструкций, не совместимых со стандартом ANSI/ISO. Некоторые из них стоят того, чтобы в них разобраться. Все конструкции, рассматриваемые в этой книге, более подробно изложены в документации по gcc
.
Тип long long
указывает на то, что блок памяти, по крайней мере, такой же большой, как long
. На Intel i86 и других 32-разрядных платформах long
занимает 32 бита, а long long
— 64 бита. На 64-разрядных платформах указатели и long long
занимают 64 бита, a long
может занимать 32 или 64 бита в зависимости от платформы. Тип long long
поддерживается в стандарте С99 (ISO/IEC 9899:1999) и является давним расширением С, которое обеспечивается gcc
.
5.2.2. Встроенные функции
В некоторых частях заголовочных файлов Linux (в частности тех, что специфичны для конкретной системы) встроенные функции используются очень широко. Они так же быстры, как и макросы (нет затрат на вызовы функции), и обеспечивают все виды проверки, которые доступны при нормальном вызове функции. Код, вызывающий встроенные функции, должен компилироваться, по крайней мере, с включенной минимальной оптимизацией ( -O
).
5.2.3. Альтернативные расширенные ключевые слова
В gcc
у каждого расширенного ключевого слова (ключевые слова, не описанные стандартом ANSI/ISO) есть две версии: само ключевое слово и ключевое слово, окруженное с двух сторон двумя символами подчеркивания. Когда компилятор применяется в стандартном режиме (обычно тогда, когда задействована опция -ansi
), обычные расширенные ключевые слова не распознаются. Так, например, ключевое слово attribute
в заголовочном файле должно быть записано как __attribute__
.
Расширенное ключевое слово attribute
используется для передачи gcc
большего объема информации о функции, переменной или объявленном типе, чем это позволяет код С, соответствующий стандарту ANSI/ISO. Например, атрибут aligned
дает указание gcc о том, как именно выравнивать переменную или тип; атрибут packed
указывает на то, что заполнение использоваться не будет; noreturn
определяет то, что возврат из функции никогда не произойдет, что позволяет gcc
лучше оптимизироваться и избегать фиктивных предупреждений.
Атрибуты функции объявляются путем их добавления в объявление функции, например:
void die_die_die(int, char*) __attribute__ ((__noreturn__));
Объявление атрибута размещается между скобками и точкой с запятой и содержит ключевое слово attribute
, за которым следуют атрибуты в двойных круглых скобках. Если атрибутов много, следует использовать список, разделенный запятыми.
int printm(char*, ...)
__attribute__((const,
format(printf, 1, 2)));
В этом примере видно, что printm
не рассматривает никаких значений, кроме указанных, и не имеет побочных эффектов, относящихся к генерации кода ( const
), printm указывает на то, что gcc
должен проверять аргументы функции так же, как и аргументы printf()
. Первый аргумент является форматирующей строкой, а второй — первым параметром замены ( format
).
Некоторые атрибуты будут рассматриваться по мере дальнейшего изложения материала (например, во время описания сборки совместно используемых библиотек в главе 8). Исчерпывающую информацию по атрибутам можно найти в документации gcc
в формате Texinfo.
Библиотека GNU С ( glibc
) — это стандартная библиотека языка С, разработанная для Linux-систем. Существуют и другие библиотеки С, которые иногда используются в определенных целях (например, очень маленькое подмножество стандартных библиотек С применяется во встроенных системах и для начальной загрузки). Но во всех дистрибутивах Linux стандартной библиотекой языка С, предоставляющей значимый объем функциональности, является glibc
. Именно эта библиотека и описывается в настоящей книге.
6.1. Выбор возможностей glibc
В glibc
существует набор макросов для выбора возможностей. Эти макросы используются для выбора стандарта, которому будет подчиняться glibc
. Иногда стандарты конфликтуют между собой, a glibc
позволяет выбирать именно тот набор стандартов (формальный, де-юре , и неформальный, де-факто ), которым нужно соответствовать полностью либо частично. Технически такие макросы называются макросами проверки возможностей .
Читать дальше