Перейти к основному содержанию
Рецепты Linux

Main navigation

  • Основы
  • Система
  • Команды
  • Программы
  • Дистро
  • Интерфейсы
  • Устройства
  • Доки
User account menu
  • Войти

Строка навигации

  1. Главная

Команда Linux cpp

Автор: admin, 6 января, 2024
Команды

В Linux команда cpp — препроцессор языка C, который автоматически используется компилятором C для преобразования любой программы перед её компиляцией.

Использование команды Linux cpp с примерами

Этот препроцессор также называют макропроцессором, поскольку он используется для сокращения более длинного фрагмента кода. Его можно использовать только с исходным кодом C, C++ и Objective-C.

Использование других языков программирования может вызвать неопределённые проблемы.

Содержание

  • Синтаксис
  • Ключи
  • Примеры использования команды Linux cpp
    • Вывод без опций
    • Вывод с опцией -D
    • Вывод с добавлением опции -M
  • Заключение

Синтаксис

$ 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. Эта утилита является удобным и эффективным инструментом преобразования любой программы перед её компиляцией.

Последние материалы

  • Утилита sensors
    1 hour ago
  • Сканер Rkhunter
    1 week ago
  • Программа resize2fs
    1 week 6 days ago
  • Аудиопроигрыватель QMMP
    2 weeks 4 days ago
  • Программа Timeshift
    3 weeks 3 days ago
RSS feed

Secondary menu

  • О проекте

© 2008–2025 Олег Меньшенин mensh@yandex.ru