Приведенные далее опции передаются gcc в командной строке; мы перечисляем здесь только самые важные из них.
– ansi
— это самая важная опция, касающаяся стандартов и заставляющая компилятор действовать в соответствии со стандартом языка ISO C90. Она отключает некоторые расширения gcc, не совместимые со стандартом, отключает в программах на языке С комментарии в стиле С++ (
//
) и включает обработку триграфов (трехсимвольных последовательностей) ANSI. Кроме того, она содержит макрос __
STRICT_ANSI__
, который
отключает некоторые расширения в заголовочных файлах, не совместимые со стандартом. В последующих версиях компилятора принятый стандарт может измениться.
– std=
— эта опция обеспечивает более тонкий контроль используемого стандарта, предоставляя параметр, точно задающий требуемый стандарт. Далее приведены основные возможные варианты:
•
с89
— поддерживать стандарт C89;
•
iso9899:1999
— поддерживать последнюю версию стандарта ISO, C90;
•
gnu89
— поддерживать стандарт C89, но разрешить некоторые расширения GNU и некоторые функциональные возможности C99. В версии 4.2 gcc этот вариант применяется по умолчанию.
Опции для отслеживания стандарта в директивах define
Существуют константы (
#defines
), которые могут задаваться опциями в командной строке или виде определений в исходном тексте программы. Мы, как правило, считаем, что для них используется командная строка компилятора.
__STRICT_ANSI__
— заставляет применять стандарт С ISO. Определяется, когда в командной строке компилятора задана опция
– ansi
.
_POSIX_C_SOURCE=2
— активизирует функциональные возможности, определенные стандартами IEEE Std 1003.1 и 1003.2. Мы вернемся к этим стандартам чуть позже в этой главе.
_BSD_SOURCE
— включает функциональные возможности систем BSD. Если они конфликтуют с определениями POSIX, определения BSD обладают более высоким приоритетом.
_GNU_SOURCE
— допускает широкий диапазон свойств и функций, включая расширения GNU. Если эти определения конфликтуют с определениями POSIX, у последних более высокий приоритет.
Опции компилятора для вывода предупреждений
Эти опции передаются компилятору из командной строки. И снова мы перечислим лишь основные, полный список можно найти в интерактивном справочном руководстве gcc.
– pedantic
— эта наиболее мощная опция проверки чистоты, программного кода на языке С. Помимо включения опции проверки на соответствие стандарту С, она отключает некоторые традиционные конструкции языка С, запрещенные стандартом, и делает недопустимыми все расширения GNU по отношению к стандарту. Эту опцию следует применять, чтобы добиться максимальной переносимости вашего кода на С. Недостаток ее в том, что компилятор сильно озабочен чистотой вашего программного кода, и порой приходится поломать голову для того, чтобы разделаться с несколькими оставшимися предупреждениями.
– Wformat
— проверяет корректность типов аргументов функций семейства
printf
.
– Wparentheses
— проверяет наличие скобок, даже там, где они не нужны. Эта опция очень полезна для проверки того, что сложные структуры инициализированы так, как задумано.
– Wswitch-default
— проверяет наличие
варианта
default
в операторах
switch
, что обычно считается хорошим стилем программирования.
– Wunused
— проверяет разнообразные случаи, например, статические функции объявленные, но не описанные, неиспользуемые параметры, отброшенные результаты.
– Wall
— включает большинство типов предупреждений gcc, в том числе все предыдущие опции -
W
(не охватывается только
– pedantic
). С ее помощью легко добиться чистоты программного кода.
Примечание
Существует еще огромное множество дополнительных опций предупреждений, все подробности см. на Web-страницах gcc. В основном мы рекомендуем применять
– Wall
; это удачный компромисс между проверкой, обеспечивающей программный код высокого качества, и необходимостью вывода компилятором массы тривиальных предупреждений, которые становится трудно свести к нулю.
Интерфейсы и Linux Standards Base
Теперь мы собираемся подняться на уровень выше и перейти от программного кода на языке С к рассмотрению интерфейсов (системных функций), предоставляемых операционной системой. У этого уровня стандартизации есть разные составляющие: функции, предоставляемые библиотеками, и системные вызовы, реализованные операционной системой на низком уровне. И у тех, и у других есть два уровня детализации: какие интерфейсы представлены и определение того, что делает каждый интерфейс.
Определяющий документ в этой области для ОС Linux — Linux Standards Base (LSB, стандарты операционных систем на базе Linux), который можно найти на Web-сайтах http://mvw.linuxbase.org или http://www.linux-foundation.org/en/LSB. Уже выпущено несколько версий стандартов, и работа продолжается.
Список дистрибутивов, прошедших сертификацию, можно найти по адресу http://www.linux-foundation.org/en/Products. Сертифицированы разные версии Red Hat, SUSE и Ubuntu, но помните о том, что после выпуска дистрибутива до момента сертификации должно пройти некоторое время. На Web-сайте есть список дистрибутивов, проходящих тестирование или только нуждающихся в некоторых обновлениях для того, чтобы пройти сертификационные испытания.
В стандарте Linux Standards Base (что касается версии 3.1) определены три области для проверки на соответствие:
ядро — основные библиотеки, утилиты и местонахождение ключевых компонентов файловой системы;
С++ — библиотеки С++;
рабочий стол — дополнительные файлы для установок рабочего стола, в основном разные графические библиотеки.
В спецификации нас интересует больше всего ядро.
Стандарт LSB охватывает ряд областей в собственной документации, но для определений конкретных интерфейсов также приводит ссылки на внешние стандарты. В стандарте описаны следующие области:
форматы объектных файлов для двоичной совместимости;
стандарты динамического связывания;
стандартные библиотеки, как базовые, так и библиотеки X Window System;
командная оболочка и другие программы режима командной строки;
среда исполнения, включая пользователей и группы;
инициализация системы и уровни запуска (run levels).
В этой главе мы обсудим только стандартные библиотеки, пользователей и инициализацию системы.