Существует ли инструмент предварительной обработки кода, который объединил бы несколько пользовательских включений (без системных включений) в один файл?

У меня есть проект, состоящий из нескольких файлов С++. Мне нужно объединить все эти файлы в один файл main.cpp и отправить один файл по сети. Получатель на другом конце скомпилирует и запустит файл:

gcc main.cpp
./a.out

Обратите внимание, что получателем на другом конце является программа, ожидающая только один файл и не изменяющая свои инструкции по компиляции.

Например: предположим, что у меня есть следующие 2 файла:

основной.cpp:

#include <iostream>
#include <vector>    

#include <my_utils.hpp>

int main() {
    std::vector<int> v = GetVector();
    court << v.size() << endl;
    return 0;
}

my_utils.hpp:

#pragma once

#include <vector>
std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}

Вопрос: есть ли команда препроцессора, которая объединит эти два файла в один, чтобы получить следующее:

// merged.cpp
// the recipient can compile and run this file

#include <iostream>
#include <vector>

std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}

int main() {
    std::vector<int> v = GetVector();
    cout << v.size() << endl;
    return 0;
}

Стандартный препроцессор объединяет все, включая, например, большой объем кода, который содержит <vector>. Я хочу объединить несколько файлов в один, который будет содержать только мои собственные определенные функции.

Необязательно: если я не использую ProcessVector в своей основной программе, может ли препроцессор исключить эту функцию из окончательного объединенного файла?

Если вы используете Linux или аналогичную систему, вы можете использовать cat file1 file2 > result для объединения нескольких файлов в один. Какова цель этой операции?

Ted Lyngmo 09.12.2020 21:47

Пожалуйста, добавьте некоторую справочную информацию к вопросу, почему вы хотите / должны объединить файлы.

Bodo 09.12.2020 21:48

@ Human-Compiler извините, это не нужно

mercury0114 09.12.2020 21:50

@Bodo добавил объяснение моего сценария

mercury0114 09.12.2020 21:54

Если у вас возникли проблемы с ошибкой сборки, попробуйте создать минимальный воспроизводимый пример и вместо этого спросите нас об этом напрямую. Обычно это быстрее и проще.

Some programmer dude 09.12.2020 21:56

@TedLyngmo, но команда cat как есть также добавит все директивы #include <my_utils.hpp>. У получателя не будет файла my_utils.hpp на другом конце.

mercury0114 09.12.2020 21:56

Ваш вариант использования выглядит странно. Почему бы вам не отправить TAR, ZIP или другой архив или не использовать сетевой протокол, который может отправлять несколько файлов? Что такое "получатель"? Программа? Персона?

Bodo 09.12.2020 22:00

@Bodo, да, получатель - это программа, она не читает ZIP и т. д. Она просто берет текстовый файл main.cpp, компилирует его и запускает.

mercury0114 09.12.2020 22:02

@mercury0114 mercury0114 А почему он устроен таким странным образом?

Bodo 09.12.2020 22:06

@Бодо, например. многие онлайн-конкурсы и платформы по кодированию работают таким образом: https://onlinejudge.org/https://codingcompetitions.withgoogle.com/kickstart/ и т. д.

mercury0114 09.12.2020 22:06

И вы хотите автоматически отправлять множество объединенных проектов на онлайн-конкурс по программированию? Возможным алгоритмом может быть создание списка всех файлов заголовков, которые являются частью вашего проекта, cat всех файлов заголовков, за которыми следуют все исходные файлы, и удаление всех #include строк, которые ссылаются на один из файлов заголовков проекта, например, с помощью grep. Конечно, компиляция всего кода, объединенного в одну большую единицу компиляции, может дать результаты, отличные от компиляции модулей по отдельности. Вы даже можете получить ошибки, которых не было бы при обычной компиляции.

Bodo 09.12.2020 22:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
12
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю никаких методов препроцессора для этого, но есть и другие возможности. Я читал, что вы просто хотите отправить один компилируемый main.cpp файл для онлайн-соревнований по программированию, вот с чем я работал.

Если у вас есть доступ к инструментам командной строки, вы можете просто использовать sed. Если вы измените все свои локальные заголовки на #include "...", вы можете сделать:

sed '/#include ".*"/d' *.hpp *.cpp

Что это делает, так это печатает все строки, кроме строк, которые имеют от #include "..." до stdout. Все файлы .hpp будут перед всеми файлами .cpp, поэтому с прототипами не должно быть никаких сложностей. Затем вы можете просто перенаправить этот вывод в какой-либо файл.

Я собираюсь принять этот ответ. Похоже, что нет инструмента, который бы это делал, так что мне просто придется написать его самому.

mercury0114 09.12.2020 22:59

Другие вопросы по теме