Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление ненужных include'ов 
V
    Опции темы
borisbn
Дата 3.6.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Здравствуйте.

Интересует инструмент, позволяющий делать сабж. Собственно часто бывает, что включаешь какой-нить h-ник либо для отладки, либо сначала попользовал какой-нить класс, а затем передумал (провёл рефакторинг), а затем забываешь его убрать.
Понятно дело, что можно повелосипедировать - написать скриптик, который будет по-одной удалять строку с #include, вызывать компилятор, смотреть ошибки... Но хочется готового, отлаженного.
Если кто-нибудь знает такой плагин в M$VS - ещё лучше.

Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 3.6.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



недавно интересовался таким инструментом для линукс. но увы, ничего не нашел.

PM WWW   Вверх
volatile
Дата 3.6.2012, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Вот здесь что-то на питоне
http://www.catb.org/esr/deheader/
не знаю что за зверь, только что нашел.
(похоже заточена под gcc)

если под виндами переименовать файл из архива "deheader" в "deheader".py", то он даже запускается  smile (нужен установленный питон 2.*)
deheader.py --help помощь.

дальше пока не копал.

PM MAIL   Вверх
borisbn
Дата 3.6.2012, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, спасибо. Интересный скриптик. Меня только смущает гора "известных" функций и соответствующих им инклюдов в начале... зачем?
Попробую в понедельник. Я даже подключу его в студию - делал недавно разбор vcproj-файла... Если интересует - могу выложить результат сюда


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 3.6.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, ох рано спасибо сказали.
имхо это вообще не для венды...
не знаю, возможно вам удастся...

PM MAIL   Вверх
EvilsInterrupt
Дата 3.6.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Цитата

делал недавно разбор vcproj-файла

Как делали? Через XML-схему или "руками" в скрипте ?
PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 3.6.2012, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(EvilsInterrupt @  3.6.2012,  16:27 Найти цитируемый пост)
Как делали? Через XML-схему или "руками" в скрипте ? 

Первое. При помощи питоновского же xml.dom.minidom. Делал обёртку над cppchecker'ом (сорри Карпов). Он (cppchecker) умеет обрабатывать либо отдельный файл либо каталог, а в проекте на студии файлы могут быть где угодно.

Цитата(volatile @  3.6.2012,  16:21 Найти цитируемый пост)
имхо это вообще не для венды...

Я увидел там только модуль commands, который только под линукс, но это - мелочь. Заменю на какой-нить spawn.
Я собирался сам писать такое на питоне, а тут куча работы сделано. осталась мелочь. Поэтому с
Цитата(volatile @  3.6.2012,  16:21 Найти цитируемый пост)
рано спасибо сказали.

не согласен  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 3.6.2012, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, ок.
Цитата(borisbn @  3.6.2012,  15:16 Найти цитируемый пост)
Если интересует - могу выложить результат сюда 

Если будут результаты, то да, интересует, спасибо.
Я этот скрипт тоже, еще возможно покапаю...

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

PM MAIL   Вверх
volatile
Дата 4.6.2012, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Я чуток подредактировал скрипт. в принципе только функцию testcompile:
Код

def run (cmd, arg) :
    p = subprocess.Popen ([cmd, arg], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = p.stdout.read()
    retcode = p.wait()
    return (retcode, output)

def testcompile(source, maker, msg="", verbosity=0, showerrs=False):
    "Test-compile a sourcefile.  Return the status and the compilation time"
    (stem, suffix) = os.path.splitext(source)
    derived = stem + ".obj"
    if os.path.exists(derived):
        os.remove(derived)
    # command = maker + " " + derived
    start = time.time()
    (retcode, output) = run (maker, derived)
    end = time.time()
    if (retcode != 0 and showerrs) or verbosity >= COMMAND_DEBUG :
        sys.stdout.write(output)
    if retcode != 0 :
        explain = "failed"
        if verbosity >= PROGRESS_DEBUG:
            explain += " (%d)" % retcode
    else:
        explain = "succeeded"
    if verbosity >= PROGRESS_DEBUG:
        print "deheader: %s%s %s." \
          % (sourcefile, msg, explain)
    if os.path.exists(derived):
        os.remove(derived)
    return (retcode, end - start)

Ну и наверху добавил
import subprocess

После этого он даже начал фурыкать.
Выдает не только что можно удалить, но также советует кое-что добавить из хидеров, для портабельности, например:
Код

deheader: in .\randmersenne.cpp, random() portability requires <stdlib.h>.
deheader: remove <algorithm> from .\sha1_search.cpp
deheader: remove "joiner.h" from .\joiner.cpp


Теперь надо бы его как-то удобней вставлять в проект.
А то пришлось на скорую руку мейк файл делать,и запускать так: deheader.py -m nmake
Возможно вы чтонибудь получше придумаете... smile 

PM MAIL   Вверх
boostcoder
Дата 4.6.2012, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(volatile @  4.6.2012,  02:29 Найти цитируемый пост)
remove "joiner.h" from .\joiner.cpp

а это разве правильно?
PM WWW   Вверх
mrgloom
Дата 4.6.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



а нету ли такого инструмента:
например мне нужно из какого-либо кода выцепить пару функций( т.к. я не хочу использовать весь код) 

программа должна определить, что "потащут" за собой данные функции и выделить всё это в отдельные  .h и .cpp.

Это сообщение отредактировал(а) mrgloom - 4.6.2012, 13:25
PM MAIL   Вверх
borisbn
Дата 4.6.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mrgloom, вроде как в креаторе 2.5.0 есть нечто похожее, только он не тянет код, а сам вставляет нужные h-ники

Я, кстати, разочаровался в этом скрипте...
1) Он у меня периодически вылетает
Цитата
Traceback (most recent call last):
  File "d:\Distrib\Programming\deheader\deheader.py", line 1555, in <module>
    remove, verbose))
  File "d:\Distrib\Programming\deheader\deheader.py", line 1439, in deheader
    includes[:], requires, include_paths, verbose)
  File "d:\Distrib\Programming\deheader\deheader.py", line 1420, in c_analyze
    saveit.revert()
  File "d:\Distrib\Programming\deheader\deheader.py", line 1336, in revert
    os.rename(self.original, self.filename)
WindowsError: [Error 183] ═хтючьюцэю ёючфрЄ№ Їрщы

причём последняя строчка именно такая. Если расшифровать получается "Невозможно создать файл"

2) Он мне советует для совместимости вставить <sys/socket.h>, увидев Qt-шный connect

3) Сама идея, похоже, неправильная: если я включаю какой-то h-ник, в котором включен например <string>, а у себя в коде я везде использую std::string, то я должен включить <string> в cpp-шнике, а мне советуют его убрать.

Вопрос mrgloom навёл на мысль - если в креаторе эта фича нормально работает, то можно спокойно удалять все инклюды, и сказать креатору, чтоб он вставил все нужные.

Всем спасибо.

P.S. Я успел немного поковырять скриптик, но т.к. решил бросить, а обещал чем-нить поделиться, то вот наработки по распарсиванию *.vcproj
Код

import os, re
from xml.dom.minidom import parse

def get_vcproj_files( vcproj ):
    dom = parse( vcproj )
    files = []
    filesElem = dom.getElementsByTagName( "Files" )[ 0 ].getElementsByTagName( "File" )
    for fileElem in filesElem:
        f = fileElem.getAttribute( "RelativePath" )
        ext = os.path.splitext( f )[ 1 ]
        if (ext == ".cpp" or ext == ".c") and f.find( "\\moc_" ) == -1 and f.find( "\\qrc_" ) == -1:   # moc и qrc можно выкинуть, если нужны все файлы
            files.append( f )
    return files

def get_vcproj_include_paths( vcproj ):
    dom = parse( vcproj )
    paths = set()
    confElems = dom.getElementsByTagName( "Configuration" )
    rg = re.compile( r"(\$\(.*\))" )
    for conf in confElems:
        toolElems = conf.getElementsByTagName( "Tool" )
        for t in toolElems:
            if t.hasAttribute( "AdditionalIncludeDirectories" ):
                includeStr = t.getAttribute( "AdditionalIncludeDirectories" )
                for inc in includeStr.split( ";" ):
                    if inc.find( "$(ConfigurationName)" ) == -1:    # отголосок Qt
                        #inc = inc.replace( "$(QTDIR)", qtDir );
                        m = rg.search( inc )
                        if m != None:
                            e = m.group( 1 )
                            pos = inc.find( e )
                            env = inc[ pos + 2 : pos + len( e ) - 1 ]
                            inc = inc.replace( e, os.environ[ env ] )
                        paths.add( inc )
    return paths


Это сообщение отредактировал(а) borisbn - 4.6.2012, 13:43


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mrgloom
Дата 5.6.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



собственно говоря это(в креаторе) работает для всех случаев? а то мне кажется, что когда начинаются всякие макросы\темплейты и прочее всё становится не так очевидно.

Это сообщение отредактировал(а) mrgloom - 5.6.2012, 08:57
PM MAIL   Вверх
borisbn
Дата 5.6.2012, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mrgloom @  5.6.2012,  08:57 Найти цитируемый пост)
собственно говоря это работает для всех случаев? 

что это ?
Если ты про креатор, то я, честно говоря, в глаза 2.5.0 не видел. Только читал по-диагонали про него


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.