Visual Studio: автоматический отступ после вызова макроса без закрытия точки с запятой не работает

Я активировал автоматическое форматирование кода в Visual Studio 2015 для устаревшего проекта C++.

Проблема в том, что строки кода после определенных вызовов макросов (не закрывающиеся точкой с запятой, поскольку они находятся внутри макроса) всегда имеют отступ. Я ищу параметр в Visual Studio 2015, чтобы предотвратить это, без необходимости устанавливать другое расширение, необходимости изменять само определение макроса или просить всех добавить дополнительную точку с запятой в вызов (что бы это исправить).

Вот минимальный пример того, как выглядит код и вытекающая из него проблема:

#include <iostream>

#ifdef _DEBUG
# define MY_TRACE(X) do { std::cout << X << std::endl; } while (0);
#else
# define MY_TRACE(X) {}
#endif

int main()
{
    MY_TRACE( "Hello World!" )
        return 0;
}

Итак, у меня есть следующие настройки, которые автоматически делают отступ, например. на <Enter> или с } :

Параметры автоформатирования C++

И следующие настройки отступа:

Настройки отступов C++

Я пробовал все возможные и невозможные комбинации настроек там и в других местах (включая, например, поворот «Вкладки / Отступы / Смарт»). Каждый раз, когда редактор Visual Studio C++ продолжал делать отступ строки после макроса.

Я также не мог ничего найти на SO или в Интернете. Самое близкое, что я получил, но у меня не было ответа или где для другого редактора/языка:


person Florian    schedule 31.03.2017    source источник
comment
Почему бы MY_TRACE не требовать точку с запятой в конце?   -  person Vittorio Romeo    schedule 31.03.2017
comment
Прикомандирован. Строка без точки с запятой выглядит очень странно.   -  person NathanOliver    schedule 31.03.2017
comment
@VittorioRomeo Это возможно, но для этого потребуется пройти через много устаревшего кода. Также обсуждалось отказаться от этого макроса и просто добавить еще один, который требует точки с запятой, но я думаю, что это будет немного запутанно.   -  person Florian    schedule 31.03.2017
comment
@NathanOliver Я признаю, что это выглядит странно, даже после 20 лет просмотра этого кода. Но в том-то и дело: это решение было принято давно и с тех пор используется во многих кодах. И да, может быть, это уже ответ: как современный редактор C++ может знать или заботиться о грехах кодирования, совершенных в прошлом.   -  person Florian    schedule 31.03.2017
comment
Добавление (лишней) точки с запятой в конец макроса ничему не повредит. Это просто пустое заявление. Вам не нужно менять макрос или рисковать что-то сломать.   -  person Cody Gray    schedule 31.03.2017
comment
@CodyGray Да, дополнительная точка с запятой в конце вызова макроса была бы лучшим решением (как визуально, так и для совместимости кода). На данный момент у него просто есть некоторые проблемы с устаревшими компиляторами, которые мы все еще поддерживаем, которые дают дополнительный ';' предупреждение в таких случаях (в основном, как описано в GHS C++: дополнительное диагностическое сообщение с точкой с запятой - цель?). Если я правильно понимаю точку с запятой после функции, ; пустые операторы официально появились в C++11.   -  person Florian    schedule 31.03.2017
comment
В моем случае, когда у меня есть определение для начала определенного цикла (#define forever for(;;)) и, следовательно, я не могу требовать точку с запятой, это также проблема. Однако я согласен с тем, что в приведенном выше случае должна быть точка с запятой.   -  person Lukas Kalinski    schedule 15.03.2018