Введение в утилиту c99
Спецификация POSIX определяет c99 как стандартный интерфейс вызова компилятора языка Си, ориентированный на сборку исходного кода в строгом соответствии со стандартом ISO/IEC 9899:1999 (C99). Вместо сухого штудирования документации man мы разберем практическую подготовку среды в Ubuntu, сборку исходников и применение важнейших параметров командной строки. На наглядных примерах вы освоите все этапы рабочего процесса: от базовой генерации бинарника и компоновки внешних библиотек до тонкой оптимизации машинного кода и работы с макросами препроцессора.
1. Подготовка сборочного окружения и инспекция компилятора
Для беспрепятственной сборки Си-проектов в дистрибутиве Ubuntu выполним синхронизацию индексных списков APT и установим метапакет базовых инструментов сборки build-essential.

Убедимся в наличии исполняемого файла c99 в путях системного окружения $PATH, запросив его абсолютное расположение с помощью утилиты which.

С помощью аргумента --version получим детальные сведения об установленном выпуске компилятора. В экосистеме Linux утилита c99 функционирует как специализированная оболочка, форсирующая правила диалекта ISO C99.
⚙️ [Справочник ключевых параметров компиляции]
-c : выполняет компиляцию без вызова компоновщика, создавая промежуточные объектные модули (.o).-o : задает имя итогового исполняемого либо объектного файла.-O : активирует оптимизацию генерируемого кода для повышения общего быстродействия программы.-g : сохраняет отладочные символы внутри бинарного файла для последующего анализа в gdb.-I : добавляет указанный каталог в приоритетный список поиска заголовочных файлов препроцессором.-l : инструктирует линкер подключить указанную библиотеку на этапе сборки.-D : объявляет макроопределения для исходного кода до этапа непосредственной трансляции.

2. Создание демонстрационной программы и базовый запуск c99
Характерным новшеством спецификации C99 стала возможность инкапсулировать объявление управляющей переменной прямо внутри заголовка цикла for. Сформируем тестовый файл hello_c99.c, содержащий данную конструкцию:

Скомпилируем исходник hello_c99.c посредством c99, применив опцию -o для назначения имени готовому исполняемому файлу hello_c99:

Запустим собранный бинарник hello_c99, чтобы проверить корректность работы цикла и вывода строк:

3. Подключение математической библиотеки (-lm) и макросы препроцессора (-D)
Для исследования механизмов условной сборки и связывания со сторонними библиотечными модулями подготовим листинг math_demo.c, использующий функции заголовочного файла math.h и директиву #ifdef DEBUG:
![cat « ‘EOF’ > math_demo.c
#include <stdio.h>
#include <math.h>
int main(void) {
#ifdef DEBUG
printf("[DEBUG 모드 활성화]\n");
#endif
double val = sqrt(16.0);
printf(“sqrt(16.0) = %.2f\n”, val);
return 0;
}
EOF](/ubuntu/20261016_014853_84/captures/s03_c01_cat_____EOF____math_demo_c__include__stdio_h___inc.png)
Соберем проект в исполняемый файл math_demo, определив макрос отладки с помощью -DDEBUG и подключив системную математическую библиотеку ключом -lm:

Запустим полученный файл math_demo, подтверждая вывод служебного сообщения отладки и правильность вычисления квадратного корня:

4. Активация предупреждений компилятора (-Wall) и уровней оптимизации (-O2)
Для демонстрации аналитических возможностей компилятора и эффекта ускорения циклов создадим исходный код opt_demo.c, подсчитывающий сумму ряда чисел от 1 до 1 000 000:

Выполним трансляцию утилитой c99 с активацией уровня оптимизации -O2, а также флагов предупреждений -Wall и -Wextra. Подобная комбинация позволяет выявить потенциальные уязвимости и архитектурные недочеты еще на стадии компиляции, попутно максимизируя производительность бинарника:

Запустим исполняемый бинарник opt_demo, удостоверяясь в безошибочном подсчете контрольной арифметической суммы:

В данном руководстве мы подробно разобрали работу с утилитой c99 в Ubuntu: от фундаментальных требований стандарта C99 до продвинутых практик линковки, отладки и оптимизации. Внедрение рассмотренных флагов в ваши сценарии сборки обеспечит чистоту кода, стабильность приложений и полное соответствие современным требованиям стандартов POSIX.