Как правильно использовать __if_not_exists и __if_exists

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

Текущее решение (эти переменные вставляются макросом, сам я их не определяю):

{
  mytype mt_2; // 2 is pasted
  mytype mt_3; // 3 is pasted
}

Я нашел __if_not_exists и думаю, что это может быть решением моей проблемы, однако в документах Microsoft говорится

Примените оператор __if_not_exists к идентификаторам как внутри, так и вне класса. Не применяйте оператор __if_not_exists к локальным переменным.

[__if_not_exists Заявление]

Мой вопрос: почему я должен не этого делать? Есть ли кто-нибудь, кто использует это утверждение или может сказать мне правильный вариант использования этого утверждения?

Единственный (частичный/спекулятивный) ответ, который я смог найти, был опубликован [здесь, на ТАК]

EDIT 1: Что я действительно пытаюсь сделать:

{
 Logmacro(); // Logmacro() indents and logs
 Logmacro(); // Logmacro() should only log
  {
    Logmacro();  // Logmacro() indents and logs
  }

}

person dejoma    schedule 14.07.2020    source источник
comment
Вы могли бы предоставить немного больше контекста, почему вы пытаетесь решить проблему, когда я хочу предотвратить переопределение переменных (не то, чтобы это на самом деле проблема XY, которую можно решить лучше.)   -  person Scheff's Cat    schedule 14.07.2020
comment
Даже с вашим редактированием вы все равно можете предоставить больше контекста. Почему вы хотите, чтобы Foo() вел себя именно так? Мое первоначальное впечатление, что это плохая идея, потому что это было бы очень необычным поведением и, следовательно, было бы очень удивительно для любого, кто читает код. Опять же, могут быть лучшие способы решить вашу конечную цель, чем этот дизайн, на котором вы, кажется, остановились.   -  person jamesdlin    schedule 14.07.2020
comment
@jamesdlin см. редактирование, это для регистратора.   -  person dejoma    schedule 14.07.2020


Ответы (1)


Я предлагаю вообще не пытаться их использовать.

См. сообщение Рэймонда Чена: Печальная история пользовательского ключевого слова __if_exists в Visual Studio

Кроме того, попытки нарушить требования к документации бесполезны. Это может работать в некоторых случаях, но быть хрупким.

person Alex Guteniev    schedule 14.07.2020