В Linux команда cpp
— препроцессор языка C, который автоматически используется компилятором C для преобразования любой программы перед её компиляцией.
Этот препроцессор также называют макропроцессором, поскольку он используется для сокращения более длинного фрагмента кода. Его можно использовать только с исходным кодом C, C++ и Objective-C.
Использование других языков программирования может вызвать неопределённые проблемы.
Содержание
Синтаксис
$ cpp [ключи] файл...
Ключи
-pass-exit-codes
Выход с максимальным кодом возврата от прохода
--help
Показать этот текст
--target-help
Отобразить конкретные параметры командной строки (включая параметры ассемблера и компоновщика)
--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
Показать специфические ключи командной строки. (
-v --help
показывает ключи всех проходов компиляции)--version
Показать информацию о версии компилятора
-dumpspecs
Показать все встроенные спецификации
-dumpversion
Показать версию компилятора
-dumpmachine
Показать имя целевой платформы
-foffload=
Указать цели разгрузки
-print-search-dirs
Показать каталоги поиска
-print-libgcc-file-name
Показать имя run-time библиотеки компилятора
-print-file-name=
Показать полное маршрутное имя библиотеки
-print-prog-name=
Показать полное имя компонента компилятора
-print-multiarch
Показать триплет GNU, используемый как компонент маршрутных имён библиотек
-print-multi-directory
Показать корневой каталог с версиями
libgcc
-print-multi-lib
Показать соответствие между ключами каталогами поиска библиотек
-print-multi-os-directory
Показать относительный путь к библиотекам операционной системы
-print-sysroot
Показать целевой каталог библиотек
-print-sysroot-headers-suffix
Показать суффикс sysroot, используемый для поиска заголовочных файлов
-Wa,<ключи>
Передать в ассемблер <ключи>, разделённые запятыми
-Wp,<ключи>
Передать в препроцессор <ключи>, разделённые запятыми
-Wl,<ключи>
Передать компоновщику <ключи>, разделённые запятыми
-Xassembler <арг>
Передать <арг> ассемблеру
-Xpreprocessor <арг>
Передать <арг> препроцессору
-Xlinker <арг>
Передать <арг> компоновщику
-save-temps
Не удалять промежуточные файлы
-save-temps=
Не удалять промежуточные файлы
-no-canonical-prefixes
Не канонизировать пути при сборке относительных префиксов к другим компонентам
gcc
-pipe
Использовать конвейер, а не промежуточные файлы
-time
Включить хронометраж проходов
-specs=<файл>
Использовать <файл> спецификаций вместо внутренних спецификаций компилятора
-std=<стандарт>
Считать, что исходный код следует <стандарту>
--sysroot=<каталог>
Использовать <каталог> как корневой для заголовков и библиотек
-B <каталог>
Добавить <каталог> к списку поиска программ компилятора
-v
Показать команды, запускаемые компилятором
-###
Как -v, но параметры берутся в кавычки и команды не запускаются
-E
Только препроцессинг, без компиляции, сборки и компоновки
-S
Только компиляция, без ассемблирования сборки и компоновки
-c
Компиляция и сборка, но без компоновки
-o <файл>
Записать результат в <файл>
-pie
Генерировать позиционно-независимый код для выполняемых модулей
-shared
Создать разделяемую библиотеку
-x <язык>
Указать язык для следующих входных файлов. Допустимые языки: c c++ assembler none 'none' означает стандартное поведение угадывания языка по расширению файла
Ключи, начинающиеся с -g
, -f
, -m
, -O
, -W
, или --param
, автоматически передаются процессам, запускаемым cpp
. Чтобы передать ключи этим процессам, используйте ключи -W<буква>
.
Примеры использования команды Linux cpp
Вывод без опций
oleg@mobile:~:$ cpp code_a.c out.txt
Результат:
oleg@mobile:~:# 1 "code_a.c"
№1 ""
№1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
#1 "" 2
# 1 "code_a.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 367 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 368 "/usr/include/features.h" 2 3 4
# 391 "/usr/include/features.h" 3 4
..........
.............
....................
# 2 «код_a.c»
пустая функция()
{
printf("Hello, World!");
}
Выходные данные слишком велики, и на самом деле они нам не нужны для понимания концепции. Мы поняли, что он просто вызывает и заменяет весь фрагмент кода в заголовочных файлах программы.
Вывод с опцией -D
oleg@mobile:~:$ cpp -D out="Hello, World!" code_a.c out.txt
Результат:
oleg@mobile:~:# 1 "code_b.c"
№1 ""
№1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
#1 "" 2
# 1 "code_a.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 367 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 368 "/usr/include/features.h" 2 3 4
# 391 "/usr/include/features.h" 3 4
..........
.............
....................
# 2 «код_b.c»
пустая функция()
{
printf("Привет, мир!");
}
В данном случае был использован макрос, объявлений в командной строке.
Вывод с добавлением опции -M
oleg@mobile:~:$ cpp -D out="Hello, World!" -M code_a.c out.txt
В этом случае выводятся только правила, необходимые для утилиты make
.
Заключение
В этом небольшом руководстве представлен краткий обзор команды cpp
в операционной системе Linux. Эта утилита является удобным и эффективным инструментом преобразования любой программы перед её компиляцией.