company_banner

Встречайте ReSharper C++

    В течение десяти с небольшим лет своего существования ReSharper был ориентирован на .NET-разработчиков, что не удивительно для плагина к Visual Studio. 2 года назад, в чем-то благодаря удачной первоапрельской шутке, мы вплотную занялись поддержкой С++ в ReSharper, и вот совсем недавно был выпущен первый официальный релиз ReSharper C++ — нового продукта специально для разработчиков на C/С++ в Visual Studio. (Тем, кто заждался релиза CLion для кросс-платформенной разработки на C/C++, понадобится еще немного терпения.)

    Чем же может быть полезен ReSharper C++? Разберем основные возможности продукта.




    Статический анализ кода


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





    Если у вас есть прототип функции, но не хватает ее определения, ReSharper C++ предложит сгенерировать тело функции либо в этом же, либо в отдельном файле:





    Если вы решите воспользоваться функцией printf(), ReSharper C++ проверит аргументы форматирования и предложит фиксы, если найдет проблемы:





    Макросы и шаблоны


    ReSharper С++ полностью понимает все макросы, так что анализ он осуществляет именно на том коде, который получится после препроцессинга. Это дает нам ряд уникальных возможностей: например, можно «разворачивать» макросы прямо в коде:





    В случае реализации факториала через шаблоны ReSharper C++ может сразу проверить любой static_assert, написанный с использованием этого шаблона:





    Навигация и поиск


    ReSharper C++ позволяет очень быстро навигироваться по крупным проектам и искать в них нужный код. Вот некоторые из поддерживаемых возможностей навигации:



    • Go to Everything находит по названию любой тип сущности (класс, член класса, файл или папку) во всем солюшене сразу. Результаты также можно фильтровать более узкими командами, такими как Go to Type, Go to File и Go to Symbol.
    • Go to File Member позволяет быстро найти символ в том файле, где вы сейчас работаете.
    • Go to Base/Derived помогает искать наследников и родителей по классам или элементам класса. Go to Definition позволяет быстро перейти к месту объявления символа.
    • Go to Related Files применяется для перехода к файлам, которые имеют какое-то отношение к текущему. Это могут быть включенные заголовочные файлы или CPP-файлы. Кроме того, ReSharper позволяет быстро переходить между заголовочным и СРР-файлами (Ctrl+B).
    • Navigate to specializations позволяет найти все специализации шаблонного класса:


    Для поиска всех вхождений того или иного символа в ReSharper C++ имеется механизм Find Usages с возможностями предварительного просмотра, группировки и фильтрации.



    Следует отметить, что многие команды навигации доступны из контекстного меню, которое открывается по нажатию Alt+Enter:





    ReSharper С++ также включает в себя несколько окон для навигации в больших сложных проектах. Одно из этих окон называется File Structure: оно позволяет быстро сориентироваться в структуре текущего файла:



    Еще одно окно называется Inheritance Hierarchy, и в нем отображается иерархия наследования типов в виде дерева:





    Завершая тему навигации, существуют команды для перехода по элементам класса (Go to Next/Previous Member) и по найденным в файле ошибкам (Go to Next/Previous Issue).



    Шаблоны и генерация кода


    Мы адаптировали систему генерации кода и шаблонов к С++. Это означает, что в ReSharper С++ есть поддержка следующих знакомых пользователям основного ReSharper механизмов:



    • Live Templates — это шаблоны, которые ведут себя во многом подобно Visual Studio snippets, но они намного более чувствительны к контексту, а их поведение можно программировать под свои задачи.

    • Surround templates позволяют выделить кусок кода и обернуть его в ту или иную конструкцию, например в if или try-catch выражение. Эти шаблоны также доступны на любой выделенной части кода при нажатии Alt+Enter:

    • File templates дают возможность создавать как отдельные файлы, так и сразу генерировать несколько файлов с предустановленными настройками. Например, шаблон Class сразу создает и заголовочный, и CPP файл.

    Помимо шаблонов, ReSharper C++ также имеет штатные механизмы генерации кода в меню Generate:





    Рефакторинги


    Возможности рефакторинга кода — это своего рода визитная карточка ReSharper. Вот несколько рефакторингов, которые уже есть в ReSharper C++:



    • Rename позволяет переименовать символ (например имя класса или поля) и его вхождения во всем проекте.
    • Introduce Variable позволяет выделить часть вычислений и сохранить их в отдельной переменной:

    • Extract Method позволяет создать отдельную функцию из выделенного блока кода, правильно передав и вернув все нужные переменные:



    Заключение


    Вот видео, в котором показана вышеописанная функциональность в действии:





    Для использования ReSharper C++ нужна либо отдельная лицензия, либо лицензия ReSharper Ultimate.



    ReSharper C++ можно скачать отдельно или в составе полного инсталлятора ReSharper Ultimate. В обоих случаях действует 30-дневный пробный период.

    JetBrains
    Делаем эффективные инструменты для разработчиков

    Comments 60

      +3
      А ценники с Visual Assist'ом то одинаковые, по крайней мере на индивидуальную лицензию. А это прямой конкурент.
        +1
        Visual Assist умеет 2008 студию
          0
          Да, 2008 и 2005 мы целенаправленно перестали уметь несколько месяцев назад.
            0
            Жаль, потому что 2008 это последняя студия, которая не тормозит и интерфейс у неё не на убогом WPF.
              +9
              А мне каждая следующая Студия нравится больше предыдущей. 2015 вообще классная. И ничего у меня не тормозит.
                0
                WPF ведь очень дружит с аппаратным рендерингом видеокарт.
                Как-то на работе ставил эксперименты по отзывчивости довольно громоздкого WPF-приложения и опытным путем пришли к тому, что начиная с Geforce 450 с 1Gb памяти на борту всё летает, а на простеньких встроенных видеокартах подтормаживает, местами весьма ощутимо.
                  0
                  У меня, кстати, видеоядро интегрировано в не новый уже core i5-2500 (HD 3000). Работаю над софтом, использующим OpenGL, производительности более чем достаточно. Да и игры сложные пробовал со средними настройками запускать, тоже норм. Приближение к технологическому пределу сказывается, я думаю — топовое железо обновляется вдвое реже, чем 10 лет назад, а разрыв между интегрированной и топовой дискретной графикой (а особенно — между интегрированной и мэйнстрим дискретной) стал меньше.
                    0
                    Ну не знаю, он у меня даже по RDP не тормозит с сервера где вообще видеокарты, фактически нет, а так нашлёпка с 16 МБ ОЗУ в качестве кадрового буфера.
                  –1
                  Если говорить объективно, то проблема даже не в WPF. То есть, конечно, WPF это «не мёд», но уровень неэффективности студии при обычных операциях вроде добавления референса в проект просто шокирует.
                  –4
                  А это доказывает, что, в отличии от разработчиков Visual AssistX — вы не сильно понимаете мир С++. Тут компонент, стабильно работающий под VS 2008 и требующий правок «раз в полгода» — может жить на нём ещё десятилетие.
                    –2
                    Вот вам, к примеру стабильный и популярный jsoncpp — в репозитории солюшн только под VS2008 — и как с ним работать в вашем «модном» решарпере?
                      +8
                      Там же cmake. В чем собственно проблема?
                        +2
                        Берем и автоматически конвертируем в модную студию.
                        +5
                        Решение о прекращении поддержки старых студий принималось для всех продуктов семейства ReSharper Ultimate, в котором мир C++ пока что представлен только продуктом ReSharper С++. Мы предполагали, что по плюсовой части некоторые проблемы это нам принесет, но статистика использования предрелизных плюсовых билдов в разных версиях студии нас обнадежила.
                  +1
                  «Как только вы открываете Visual Studio с плюсовыми проектами, ReSharper C++ начинает анализировать ваши проекты и предлагать исправления для проблем, которые находит, и рекомендовать те или иные улучшения. Например, если вы воспользуетесь типом, не прописав ему заголовок, ReSharper C++ предложит вам сделать это...»

                  А вот это интересно, в ассисте такого нет.
                    +4
                    Есть, конечно:

                    +1
                    А утечки хоть пофиксили? А то помнится выжирал минут за 20 2 гига у процесса и визуалка даже ползать не могла.
                      +1
                      Пожалуй, вам стоит поставить и попробовать, чтобы узнать ответ на этот вопрос.
                        0
                        В соседнем посте написано, почему это наилучший выход.
                        0
                        А с Unreal Engine как сильно можно интегрироваться?
                          +3
                          Так же как и с любым другим проектом на С++, ни какой специальной интеграции нет.
                          0
                          Еще помнится обещали кроссплатформенную среду разработки для С++. Как с ней дела?
                            +7
                            Вы про CLion? Если все будет хорошо, релизится на следующей неделе.
                              0
                              Интересно есть ли какой-то общий код в плане анализа и рефакторингов или проекты существуют абсолютно отдельно друг от друга?
                                0
                                Кодовая база абсолютно разная.
                            0
                            Как у него с подержкой проектов в которых используется Managed C++ & regular C++?
                              +1
                              Никакой специфичной поддержки Managed C++ пока у нас нет. А что конкретно хотелось бы видеть?
                                0
                                Желательно иметь полную поддержку .NET подсказок как в R3 :)

                                А так просто интересно как он будет анализировать C++ код внутри managed C++ кода.
                                Поймет ли правильно using, namespace импортированы из .NET сборок? Ведь include же нету как в чистом C++.
                                  0
                                  Мдя, даже не знаю что сказать. Но первое впечатление весьма плохое.
                                  Загрузил проект где использую Managed C++ и C++, подождал пока все файла разберутся (минуты 2-3).
                                  Начал печатать код и получаю это
                                  image

                                  Как это он не видит BeginPaint??
                                  На том же проекте Visual Assist все распознает как надо. Видимо у вас Managed код вообще игнорируется.
                                  Попробовал в файле где native C++ там вроде работает нормально, но мне надо оба диалекта. Как исправите дайте знать, сразу же куплю.
                                    –1
                                    На сколько я помню, Visual Studio сама никогда не поддерживала IntelliSense for Managed C++. Разве нет?
                                      +2
                                      Managed C++ уже много лет как deprecated. Но, скорее всего, имелся в виду C++/CLI.

                                      Он вполне себе поддерживался, но его выпилили в VS 2010 (по причине полного переписывания C++ Intellisense). Потом запилили обратно в следующих версиях.
                                      +1
                                      К сожалению да, у нас пока нет поддержки Managed C++.
                                        0
                                        жаль.
                                        есть ли планы добавить?
                                          0
                                          Планы конечно есть :) но по срокам пока сказать не могу.
                                0
                                Посмотрел поддержку решарпером проектов unreal, и надо заметить, что проблемы еще есть, особенно много (мне показалось) проблем с макросами. Но даже в том состоянии, что есть сейчас, R++ уже повышает удобство разработки серьезно. Спасибо!
                                П.С. Хотя, я бы конечно лучше воспользовался clion-ом, но под него я не смог завести проект unreal-а и в этом вины jetbrains нет, потому что cmake-файл UnrealBuild генерирует только для линуксов.
                                  0
                                  Ну в принципе даже если у вас нету CMake-файла, вы можете попробовать заимпортировать в CLion сорцы. В этом случае CLion по крайней мере сгенерирует вам структуру CMakeLists со всеми файлами что вы выберете.
                                    +3
                                    В этом также нет и вины Epic Games. CLion как любая конкурентоспособная IDE должна уметь из кастомных скриптов собирать, т.е. запускать процессы с аргументами. Возможность указывать в сборке запуск процессов позволяет настраивать в IDE компиляцию любых проектов.

                                    В Qt Creator я компилировал кастомными скриптами приложение под андроид – у меня java код компилировался (в ide для c++), была сборка, запаковка apk, подпись, установка и запуск приложения. Я тоже самое мог бы сделать и в xcode например. В нем я компилировал qt проекты с помощью qmake, при этом xcode ничего не знает про qt.

                                    Было бы интересно узнать мнение, а может быть и планы JetBrains по этому поводу.
                                      0
                                      Согласен, кастомный сборщик был бы очень кстати и решил бы многие проблемы, но чтобы работать в проекте, нужно его создать, сгенерировать cmake-файл, уметь отлаживаться и тд. Думаю, что для работы друг с другом, поработать придется и тем и другим.
                                    0
                                    Поставил на машину с Win7/VS10, загрузил рабочий проект — студия повисла. Снял задачу, повторил — результат тот же. Удалил плагин.
                                      0
                                      В зависимости от сложности и объема кода, первоначальное индексирование может сопровождаться такими эффектами. Долго ждали, прежде чем снимать задачу, а потом удалять?
                                        +1
                                        В зависимости от сложности и объема кода, первоначальное индексирование может сопровождаться такими эффектами.
                                        Нужен прогресс-бар или иной идикатор активности? Кода в проекте действительно много.

                                        Долго ждали, прежде чем снимать задачу, а потом удалять?
                                        Может быть пару минут. Сначала по диспетчеру задач была видна интенсивная работа с памятью в процессе студии, а как она успокоилась, так задачу и снял.
                                          0
                                          Прогресс-бар при первоначальном построении кэшей R++ находится в правом нижнем углу студии. На сложных проекта. первичное построение кэшей может происходить достаточно долго.
                                            0
                                            В студии ничего не шевелилось ни в каком углу, было полное ощущение зависания.
                                      0
                                      Поставил ReSharper C++, попытался открыть chrome.sln, содержащий чуть более тысячи под-проектов. Это был текущий мастер хромиума www.chromium.org. Не взлетело. Студия подвисла, видимо решарпер сканирует проекты (Intellicense заранее выключил). Решил подождать, было очень интересно справится или нет. Через час студия упала, скорее всего из-за нехватки памяти. Попробовал еще 2 раза, результат неизменный — падает когда кончается адресное пространство. Очень жаль.
                                      На 4ый запуск в студия перестала так зависать и появилась возможность работать. При этом показывается прогресс сканирования файлов (Updating source files) примерно на половине. Открыл файл, решарпер показывает иконку Analisis will start shortly. Уже 15 минут.

                                      Вообще это боль, что студия не может стабильно работать с такими большими проектами. Встроенный intellisence более-менее справляется, но и ему памяти не хватает, сначала отваливается показ переменных в отладчике, а еще чуть погодя студия крашится.
                                        0
                                        То есть студия без решарпера у вас стабильно работает на chrome.sln?
                                          0
                                          Не совсем.
                                          Некоторое время работает, но потом кончается память и студия крашится. Особенно если запускать браузер под отладкой.
                                          Если не пишу код, а отлаживаю, то автокомплит не сильно нужен, и я загружаю из солюшена только несколько запускаемых проектов с помощью расширения funnel visualstudiogallery.msdn.microsoft.com/5396fa4a-d638-471b-ac3d-671ccd2ea369
                                          В этом случае все точки останова ставятся, отладка полностью работает, и студия работает достаточно стабильно, по крайней мере падений из-за кончившейся памяти нет.
                                            0
                                            Попробовал 2015 студию. Так же крашится.
                                              0
                                              Есть подозрение что R++ тут не виноват. Возможно просто Студия у вас вылетает по нехватке памяти.
                                        0
                                        Сразу вопрос — вот такое вот он съест?
                                        template<bool> struct a_t;
                                        
                                        template<> struct a_t<true> {
                                            template<int> struct b {};
                                        };
                                        
                                        template<> struct a_t<false> {
                                            enum { b };
                                        };
                                        
                                        typedef a_t<sizeof(void*)==sizeof(int)> a;
                                        
                                        enum { c, d };
                                        int main() {
                                            a::b<c>d; // declaration or expression?
                                        }
                                        

                                        И что именно будет в результате (и, в частности, будет ли оно зависеть от настроек текущей конфигурации проекта)?
                                          +1
                                          Команда утверждает, что все правильно распарсится в зависимости от настроек проекта
                                          0
                                          Хотел сказать пару слов.
                                          goo.gl/nqkEed (прошу прощения, картинки, как, впрочем, и ссылки, не могу вставлять)
                                          Подсказки с предложением вставить #include ну ООЧЕНЬ доставучие, хоть и удобные. Ну никак не хотят закрываться, и еще слишком быстро показываются, можно случайно на них кликнуть, бегая по коду.

                                          И еще. Я полностью выключил Intellisense (не знаю, связано ли с этим), ввожу «Acti..» и вместо того, чтобы получать «Actions», получаю переход на следующую строку.
                                          goo.gl/VwyU0U
                                          goo.gl/yg7nu8

                                            0
                                            Спасибо, проблема с перекрыванием попапов и комплишна нам уже известна, работаем над починкой этого механизма.
                                            0
                                            Постоянно случаются зависания при перестроении кэша на моем проекте (70 тыс. строк).
                                            Особенно часто зависание на файле objidlbase.h
                                            Только после несколько убийств процесса devenv.exe и перезапуска, а также удаления папки C:\Users\user\AppData\Local\JetBrains\Transient\ReSharperPlatformVs12\v02\SolutionCaches
                                            перестает зависать.
                                            Помню в IDEA как-то можно было отправить какой-то дамп (callstack или что-то такое) чтобы вы разобрались, в ReSharper есть такая возможность?
                                              0
                                              А вы не могли бы снять для нас снэпшот через ReSharper|Help|Profile Visual Studio и залить его к нам <a href=«youtrack.jetbrains.com>в трекер?
                                                0
                                                  0
                                                  Когда это случится еще раз, обязательно сделаю. Пока всё работает, тьфу-тьфу-тьфу, поэтому трогать не буду.
                                                  Еще проблема в том, что очень часто при перестроении кэша студия виснет намертво, и сделать что-нибудь (в т.ч. снять снэпшот) невозможно.
                                                    +1
                                                    Отправил снэпшот и дамп, удивительно быстро починили (буквально через пару часов), жду обновлений!
                                              0
                                              А умеет ли Resharper C++ с конвертировать C-style cast в соответствующий С++ cast во всем солюшене?
                                                0
                                                Пока эта фиче не обладает Fix in Scope, но я попрошу девелоперов сделать — думаю это не сложно.

                                            Only users with full accounts can post comments. Log in, please.