Автоматически создавать файл C ++ из заголовка?

У меня есть куча файлов заголовков C ++ с различными объявлениями классов и функций. До сих пор, когда я писал реализации объявленных классов и функций исходных файлов C ++, я вручную:

  1. Копирование объявлений из файла заголовка в соответствующий исходный файл.
  2. Удаление "class classname {" и соответствующего "};"
  3. Добавление "classname ::" к именам всех функций класса.
  4. Замена точки с запятой после объявления функции на "{}".
  5. Удаление ключевых слов «виртуальный» и «статический».

Только после всей этой работы, которая на самом деле ничего не делает, я могу приступить к реализации функций. Мне интересно, есть ли где-нибудь инструмент, который может автоматически генерировать файл ".cpp" из файла ".h", где полученный ".cpp" содержит пустые заглушки для функций, объявленных в файле ".h" (и для которого не было дано встроенное определение). Было бы предпочтительнее использовать дружественный к UNIX инструмент командной строки. Спасибо.

ОБНОВЛЕНИЕ: идеально подойдет кроссплатформенный инструмент. Если нет, то я работаю над Mac OS X 10.6.


person Michael Aaron Safyan    schedule 10.09.2009    source источник


Ответы (4)


Ленивый C ++, похоже, разработан для решения именно этой проблемы.

person moonshadow    schedule 10.09.2009
comment
Ленивый C ++ не может быть установлен в Mac OS X ... это то, что я использую. Есть ли какие-нибудь известные вам кроссплатформенные генераторы, которые можно легко собрать из исходников? - person Michael Aaron Safyan; 10.09.2009
comment
@Michael: вы можете получить исходный код и выполнить кросс-компиляцию для OSX, см., Например, ответ на stackoverflow.com/questions/1375201/ - person moonshadow; 10.09.2009
comment
@moonshadow, я пытаюсь сэкономить время, помнишь? Мне, вероятно, потребуется меньше времени, чтобы написать свой собственный инструмент, чем попытаться уговорить gcc построить как кросс-инструментальную цепочку. - person Michael Aaron Safyan; 10.09.2009
comment
@Christian Adam, я скачал исходный код ... к сожалению, это самозагрузка. Для сборки Lazy C ++ требуется двоичный файл Lazy C ++. - person Michael Aaron Safyan; 10.09.2009
comment
@Michael: Если у вас есть набор файлов .h и .cpp для lzz, сборка будет тривиальной, вы просто скопируете исходный код на свой Mac, а затем создадите его там. Код на C ++ высокого качества. Меня всегда смешит, когда я слышу, как кто-то говорит: мне, наверное, потребовалось бы меньше времени, чтобы написать свой собственный ... Мне были бы интересны любые примеры из вашего прошлого, когда это оказалось правдой! - person Richard Corden; 16.09.2009
comment
@ Ричард, это правда. Я не особо серьезно относился к написанию своего собственного ... именно поэтому я задал первоначальный вопрос в первую очередь. - person Michael Aaron Safyan; 08.11.2009

Недавно я оказался в вашей ситуации, и мне пришлось написать свой собственный инструмент - impl_me. Это небольшой сценарий Ruby, который использует SWIG в качестве серверной части парсера. Он записывается в стандартный вывод, поэтому вы можете комбинировать его с вашим любимым набором инструментов nix _1 _ / _ 2 _ / _ 3 _ / _ 4_, чтобы настроить свои собственные предпочтения.

Поскольку он написан на Ruby, он должен быть кроссплатформенным. SWIG также является кроссплатформенным, так что все должно быть в порядке.

На данном этапе он довольно примитивен и не так надежен, как Lazy C ++, с точки зрения анализа странных шаблонов и прочего. Взносы приветствуются :)

person kizzx2    schedule 24.07.2010
comment
Похоже, что инструмент swig больше не работает правильно. Я получаю сообщение об изменении названия драгоценного камня на "Оптимист". - person HSchmale; 24.02.2019

eclipse CDT имеет функцию «Внедрить метод», которая делает именно это (по одному методу за раз). . Также существует функция «Генерация геттеров и сеттеров», которая также генерирует соответствующий код в телах функций.

person LumpN    schedule 10.09.2009
comment
Спасибо. Я ищу вызов из командной строки ... что-то, что я могу использовать в команде find для рекурсивного создания файлов .cpp для всех файлов заголовков в моем проекте. - person Michael Aaron Safyan; 11.09.2009

Я пробовал Lazy C ++, но, похоже, он устарел и больше не поддерживается. Он также не поддерживает последний стандарт C ++ 14.

Вот почему я решил написать свой собственный инструмент на Java с использованием ANTLR4. Он называется Score, и вы можете найти его здесь: https://github.com/underrated/Score.

На данный момент он находится в зачаточном состоянии и может быть полон ошибок, но я планирую его улучшить. Так что попробуйте, если хотите, и сообщайте о любых ошибках на странице проекта на github. Я постараюсь исправить их как можно быстрее.

person Tiberius P.    schedule 09.08.2016
comment
Я не ожидаю, что на данный момент он будет обрабатывать условные обозначения препроцессора, но я планирую добавить для этого поддержку. В остальном инструмент не предназначен для семантических проверок кода. Он просто идентифицирует реализации метода, а затем помещает прототипы метода в заголовок, а реализацию метода в исходный файл (плюс еще несколько разделений). Разработчик должен обеспечить правильность кода (например, с помощью IDE). Если исходный код имеет синтаксические / семантические ошибки, то также будет и сгенерированный. Но их можно найти либо в среде IDE, либо в компиляторе. - person Tiberius P.; 09.08.2016
comment
@IraBaxter Зачем вам такая сложная работа с вещами в контексте проблемы Майкла? Все, что ему нужно, это автоматизировать копирование / вставку / изменение некоторого кода. Особый подход к #ifdefs действительно необходим. Шаблоны не нужно трогать, они могут оставаться в шапке. Вызовы макросов будут восприниматься анализатором как простые идентификаторы или вызовы функций, и их тоже не нужно будет трогать. Что касается пространств имен, все операторы using ... могут оставаться в заголовке. И пространство имен ... {...} можно скопировать как в заголовок, так и в исходный файл. Я что-то упускаю? - person Tiberius P.; 09.08.2016