Почему форматировщик кода Eclipse CDT иногда вводит пробелы в аргументах шаблона? - PullRequest
1 голос
/ 07 ноября 2019

Я использую Eclipse 4.12.0 и Eclipse CDT 9.8.1, и я пишу код C ++, который использует std::tuple. Иногда средство форматирования кода вводит дополнительные пробелы в мой код, где я получаю записи кортежей.

Пожалуйста, рассмотрите следующий файл примера:

#include <tuple>

int main(int, char**)
{
    std::tuple<int, int> myTuple; // First important line

    std::get<0>(myTuple) = 2; // Second important line

    return 0;
}

Я вставил сюда код, отформатированный в Eclipse. Все хорошо в этом примере. Но когда я копирую и вставляю две строки, помеченные как важные в комментариях, в другой файл .cpp моего проекта и форматирую их, получается следующее:

    std::tuple<int, int> myTuple; // First important line

    std::get < 0 > (myTuple) = 2; // Second important line

Форматировщик вводил пробелы до и послеугловые скобки шаблона, как если бы я делал сравнение «больше чем» или «меньше чем». Этот эффект, похоже, как-то зависит от проекта. Если это происходит в исходном файле одного проекта в моем обозревателе проектов, похоже, это происходит в каждом исходном файле этого проекта . Но как только я вставляю строки в исходный файл другого проекта, средство форматирования кода ведет себя корректно (как в приведенном выше примере файла).

Я не сообщил об этом какошибка, так как я не знаю, как сделать его воспроизводимым. У кого-нибудь есть идея, в чем причина? Я не включил специфичные для проекта параметры форматирования кода, поэтому это не должно быть простой ошибкой конфигурации. Также добавление или удаление строки #include <tuple> не имеет значения. Что еще я мог попробовать?

1 Ответ

1 голос
/ 11 ноября 2019

Непосредственной причиной проблемы почти наверняка является то, что Eclipse неправильно анализирует код и считает, что символы < и > на самом деле являются операторами сравнения в том случае, если вокруг них ставятся пробелы.

А почему он неправильно анализирует код? C ++ - сложный язык для анализа, и анализатор CDT не поспевает за новыми версиями языка C ++ (и при этом он никогда не был полностью точным даже для более старых версий C ++).

Факт, что «если это происходит висходный файл одного проекта, кажется, происходит в каждом исходном файле этого проекта "предполагает, что неправильный анализ происходит внутри заголовочного файла, чье разобранное представление является общим для всех файлов в проекте.

При форматированииваша единственная проблема с Eclipse CDT, я рекомендую плагин CppStyle . При этом используется формататор на основе clang, у которого нет проблем с правильным синтаксическим анализом C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...