В течение десяти с небольшим лет своего существования 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-дневный пробный период.

Комментарии (60)


  1. maksqwe
    10.04.2015 13:12
    +3

    А ценники с Visual Assist'ом то одинаковые, по крайней мере на индивидуальную лицензию. А это прямой конкурент.


    1. zenden2k
      10.04.2015 13:43
      +1

      Visual Assist умеет 2008 студию


      1. gorohoroh
        10.04.2015 13:54

        Да, 2008 и 2005 мы целенаправленно перестали уметь несколько месяцев назад.


        1. SerJook
          10.04.2015 14:21

          Жаль, потому что 2008 это последняя студия, которая не тормозит и интерфейс у неё не на убогом WPF.


          1. VioletGiraffe
            10.04.2015 22:15
            +9

            А мне каждая следующая Студия нравится больше предыдущей. 2015 вообще классная. И ничего у меня не тормозит.


            1. maseal
              11.04.2015 10:08

              WPF ведь очень дружит с аппаратным рендерингом видеокарт.
              Как-то на работе ставил эксперименты по отзывчивости довольно громоздкого WPF-приложения и опытным путем пришли к тому, что начиная с Geforce 450 с 1Gb памяти на борту всё летает, а на простеньких встроенных видеокартах подтормаживает, местами весьма ощутимо.


              1. VioletGiraffe
                11.04.2015 10:17

                У меня, кстати, видеоядро интегрировано в не новый уже core i5-2500 (HD 3000). Работаю над софтом, использующим OpenGL, производительности более чем достаточно. Да и игры сложные пробовал со средними настройками запускать, тоже норм. Приближение к технологическому пределу сказывается, я думаю — топовое железо обновляется вдвое реже, чем 10 лет назад, а разрыв между интегрированной и топовой дискретной графикой (а особенно — между интегрированной и мэйнстрим дискретной) стал меньше.


              1. IRainman
                12.04.2015 14:59

                Ну не знаю, он у меня даже по RDP не тормозит с сервера где вообще видеокарты, фактически нет, а так нашлёпка с 16 МБ ОЗУ в качестве кадрового буфера.


          1. mezastel Автор
            12.04.2015 20:25
            -1

            Если говорить объективно, то проблема даже не в WPF. То есть, конечно, WPF это «не мёд», но уровень неэффективности студии при обычных операциях вроде добавления референса в проект просто шокирует.


        1. tangro
          10.04.2015 15:52
          -4

          А это доказывает, что, в отличии от разработчиков Visual AssistX — вы не сильно понимаете мир С++. Тут компонент, стабильно работающий под VS 2008 и требующий правок «раз в полгода» — может жить на нём ещё десятилетие.


          1. tangro
            10.04.2015 15:54
            -2

            Вот вам, к примеру стабильный и популярный jsoncpp — в репозитории солюшн только под VS2008 — и как с ним работать в вашем «модном» решарпере?


            1. Gorthauer87
              10.04.2015 16:04
              +8

              Там же cmake. В чем собственно проблема?


            1. DancingOnWater
              14.04.2015 13:02
              +2

              Берем и автоматически конвертируем в модную студию.


          1. gorohoroh
            10.04.2015 17:43
            +5

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


  1. maksqwe
    10.04.2015 13:18
    +1

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

    А вот это интересно, в ассисте такого нет.


    1. tangro
      10.04.2015 15:58
      +4

      Есть, конечно:


  1. AxisPod
    10.04.2015 13:48
    +1

    А утечки хоть пофиксили? А то помнится выжирал минут за 20 2 гига у процесса и визуалка даже ползать не могла.


    1. gorohoroh
      10.04.2015 13:51
      +1

      Пожалуй, вам стоит поставить и попробовать, чтобы узнать ответ на этот вопрос.


    1. gorohoroh
      10.04.2015 14:56

      В соседнем посте написано, почему это наилучший выход.


  1. KaaPex
    10.04.2015 13:54

    А с Unreal Engine как сильно можно интегрироваться?


    1. gibson_dev
      10.04.2015 14:03
      +3

      Так же как и с любым другим проектом на С++, ни какой специальной интеграции нет.


  1. NeoCode
    10.04.2015 14:01

    Еще помнится обещали кроссплатформенную среду разработки для С++. Как с ней дела?


    1. gorohoroh
      10.04.2015 14:02
      +7

      Вы про CLion? Если все будет хорошо, релизится на следующей неделе.


      1. Benedict
        10.04.2015 22:28

        Интересно есть ли какой-то общий код в плане анализа и рефакторингов или проекты существуют абсолютно отдельно друг от друга?


        1. mezastel Автор
          10.04.2015 22:35

          Кодовая база абсолютно разная.


  1. Holms
    10.04.2015 22:21

    Как у него с подержкой проектов в которых используется Managed C++ & regular C++?


    1. mezastel Автор
      10.04.2015 22:34
      +1

      Никакой специфичной поддержки Managed C++ пока у нас нет. А что конкретно хотелось бы видеть?


      1. Holms
        11.04.2015 17:45

        Желательно иметь полную поддержку .NET подсказок как в R3 :)

        А так просто интересно как он будет анализировать C++ код внутри managed C++ кода.
        Поймет ли правильно using, namespace импортированы из .NET сборок? Ведь include же нету как в чистом C++.


        1. Holms
          13.04.2015 08:44

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

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


          1. outcoldman
            13.04.2015 16:16
            -1

            На сколько я помню, Visual Studio сама никогда не поддерживала IntelliSense for Managed C++. Разве нет?


            1. int19h
              14.04.2015 08:08
              +2

              Managed C++ уже много лет как deprecated. Но, скорее всего, имелся в виду C++/CLI.

              Он вполне себе поддерживался, но его выпилили в VS 2010 (по причине полного переписывания C++ Intellisense). Потом запилили обратно в следующих версиях.


          1. mezastel Автор
            13.04.2015 18:22
            +1

            К сожалению да, у нас пока нет поддержки Managed C++.


            1. Holms
              13.04.2015 20:37

              жаль.
              есть ли планы добавить?


              1. mezastel Автор
                14.04.2015 22:04

                Планы конечно есть :) но по срокам пока сказать не могу.


  1. fogone
    10.04.2015 23:11

    Посмотрел поддержку решарпером проектов unreal, и надо заметить, что проблемы еще есть, особенно много (мне показалось) проблем с макросами. Но даже в том состоянии, что есть сейчас, R++ уже повышает удобство разработки серьезно. Спасибо!
    П.С. Хотя, я бы конечно лучше воспользовался clion-ом, но под него я не смог завести проект unreal-а и в этом вины jetbrains нет, потому что cmake-файл UnrealBuild генерирует только для линуксов.


    1. mezastel Автор
      10.04.2015 23:39

      Ну в принципе даже если у вас нету CMake-файла, вы можете попробовать заимпортировать в CLion сорцы. В этом случае CLion по крайней мере сгенерирует вам структуру CMakeLists со всеми файлами что вы выберете.


    1. AndyRoss
      11.04.2015 12:44
      +3

      В этом также нет и вины Epic Games. CLion как любая конкурентоспособная IDE должна уметь из кастомных скриптов собирать, т.е. запускать процессы с аргументами. Возможность указывать в сборке запуск процессов позволяет настраивать в IDE компиляцию любых проектов.

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

      Было бы интересно узнать мнение, а может быть и планы JetBrains по этому поводу.


      1. fogone
        13.04.2015 11:34

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


  1. arabesc
    11.04.2015 00:43

    Поставил на машину с Win7/VS10, загрузил рабочий проект — студия повисла. Снял задачу, повторил — результат тот же. Удалил плагин.


    1. gorohoroh
      11.04.2015 02:55

      В зависимости от сложности и объема кода, первоначальное индексирование может сопровождаться такими эффектами. Долго ждали, прежде чем снимать задачу, а потом удалять?


      1. arabesc
        11.04.2015 04:52
        +1

        В зависимости от сложности и объема кода, первоначальное индексирование может сопровождаться такими эффектами.
        Нужен прогресс-бар или иной идикатор активности? Кода в проекте действительно много.

        Долго ждали, прежде чем снимать задачу, а потом удалять?
        Может быть пару минут. Сначала по диспетчеру задач была видна интенсивная работа с памятью в процессе студии, а как она успокоилась, так задачу и снял.


        1. mezastel Автор
          16.04.2015 00:20

          Прогресс-бар при первоначальном построении кэшей R++ находится в правом нижнем углу студии. На сложных проекта. первичное построение кэшей может происходить достаточно долго.


          1. arabesc
            16.04.2015 01:36

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


  1. drBasic
    12.04.2015 18:57

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

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


    1. gorohoroh
      14.04.2015 18:45

      То есть студия без решарпера у вас стабильно работает на chrome.sln?


      1. drBasic
        15.04.2015 18:58

        Не совсем.
        Некоторое время работает, но потом кончается память и студия крашится. Особенно если запускать браузер под отладкой.
        Если не пишу код, а отлаживаю, то автокомплит не сильно нужен, и я загружаю из солюшена только несколько запускаемых проектов с помощью расширения funnel visualstudiogallery.msdn.microsoft.com/5396fa4a-d638-471b-ac3d-671ccd2ea369
        В этом случае все точки останова ставятся, отладка полностью работает, и студия работает достаточно стабильно, по крайней мере падений из-за кончившейся памяти нет.


        1. drBasic
          15.04.2015 19:06

          Попробовал 2015 студию. Так же крашится.


          1. mezastel Автор
            16.04.2015 00:18

            Есть подозрение что R++ тут не виноват. Возможно просто Студия у вас вылетает по нехватке памяти.


  1. int19h
    14.04.2015 08:09

    Сразу вопрос — вот такое вот он съест?

    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. gorohoroh
      14.04.2015 17:11
      +1

      Команда утверждает, что все правильно распарсится в зависимости от настроек проекта


  1. zenden2k
    17.04.2015 08:09

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

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


    1. mezastel Автор
      17.04.2015 09:43

      Спасибо, проблема с перекрыванием попапов и комплишна нам уже известна, работаем над починкой этого механизма.


  1. zenden2k
    18.04.2015 11:40

    Постоянно случаются зависания при перестроении кэша на моем проекте (70 тыс. строк).
    Особенно часто зависание на файле objidlbase.h
    Только после несколько убийств процесса devenv.exe и перезапуска, а также удаления папки C:\Users\user\AppData\Local\JetBrains\Transient\ReSharperPlatformVs12\v02\SolutionCaches
    перестает зависать.
    Помню в IDEA как-то можно было отправить какой-то дамп (callstack или что-то такое) чтобы вы разобрались, в ReSharper есть такая возможность?


    1. mezastel Автор
      18.04.2015 15:44

      А вы не могли бы снять для нас снэпшот через ReSharper|Help|Profile Visual Studio и залить его к нам <a href=«youtrack.jetbrains.com>в трекер?


      1. mezastel Автор
        18.04.2015 15:49

        1. zenden2k
          19.04.2015 16:29

          Когда это случится еще раз, обязательно сделаю. Пока всё работает, тьфу-тьфу-тьфу, поэтому трогать не буду.
          Еще проблема в том, что очень часто при перестроении кэша студия виснет намертво, и сделать что-нибудь (в т.ч. снять снэпшот) невозможно.


          1. zenden2k
            20.04.2015 16:59
            +1

            Отправил снэпшот и дамп, удивительно быстро починили (буквально через пару часов), жду обновлений!


  1. KindDragon
    22.04.2015 15:46

    А умеет ли Resharper C++ с конвертировать C-style cast в соответствующий С++ cast во всем солюшене?


    1. mezastel Автор
      22.04.2015 17:06

      Пока эта фиче не обладает Fix in Scope, но я попрошу девелоперов сделать — думаю это не сложно.


      1. KindDragon
        22.04.2015 18:37

        Классно!