Перемещение объявлений методов C ++ из файла .hh в файл .cc

Я работаю над проектом C ++, в котором есть много классов, которые имеют классы, методы и включают все в один файл. Это большая проблема, потому что часто реализации метода требуют операторов #include, и любой файл, который хочет использовать класс, наследует эти #include транзитивно. Я просто подумал, что было бы неплохо иметь инструмент, который выполнял бы следующую операцию с файлом заголовка C ++:

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

Я понимаю, что синтаксический анализ C ++ очень сложен, но даже то, что работало неидеально, было бы улучшением по сравнению с повторяющимся редактированием текста, которым я сейчас занимаюсь. Есть ли что-нибудь подобное? Или я застрял перед выбором: откатать собственное решение или пробить его с помощью текстового редактора?


person James Thompson    schedule 02.09.2009    source источник
comment
Это похоже на дубликат: stackoverflow.com/questions/976467/ и stackoverflow.com/questions/652779/   -  person Richard Corden    schedule 04.09.2009


Ответы (2)


Вы ищете что-то вроде Ленивый C ++?

Lzz - это инструмент, который автоматизирует многие обременительные задачи программирования на C ++. Это может сэкономить вам много времени и сделать программирование более приятным. Учитывая последовательность объявлений, Lzz сгенерирует ваш заголовочный и исходный файлы.

Пример с того же места:

    // A.lzz
    class A
    {
    public:
      inline void f (int i) { ... }
      void g (int j = 0) { ... }
    };
    bool operator == (A const & a1, A const & a2) { ... }

Lzz will generate a header file:

    // A.h
    #ifndef LZZ_A_h
    #define LZZ_A_h
    class A
    {
    public:
      void f (int i);
      void g (int j = 0);
    };
    inline void A::f (int i) { ... }
    bool operator == (A const & a1, A const & a2);
    #endif

And a source file:

    // A.cpp
    #include "A.h"
    void A::g (int j) { ... }
    bool operator == (A const & a1, A const & a2) { ... }
person AraK    schedule 02.09.2009
comment
Вполне возможно! Спасибо за ссылку, посмотрю. - person James Thompson; 03.09.2009

Шаг 1 должен быть достаточно простым, хотя у меня нет никаких рекомендаций. 2 и 3 намного сложнее. Взгляните на этот вопрос .

person KeithB    schedule 02.09.2009