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

Я смотрю на какой-то пользовательский код, касающийся недостижимого кода. Короче говоря, у меня есть макрос, который помечает определенный код как логически недостижимый. Это можно использовать как:

int boolToInt(bool b)
{
    switch (b)
    {
        case true: return 1;
        case false: return 0;
    }
    MY_UNREACHABLE("All cases are covered within the switch");
}

Точно так же я пытаюсь повторно использовать этот макрос в местах, где компилятор уже знает, что код недоступен.

while (true)
{
    if (++i == 42)
        return j;
    // ...
}
MY_UNREACHABLE("Infinite loop that always returns/continues, never breaks");

Тем не менее, в некоторых случаях MSVC по-прежнему выдает предупреждение о недоступности кода при пользовательской обработке макроса недоступности. Упрощенная версия выглядит так:

// MSVC: cl.exe  /std:c++latest /W4
// Clang: clang++ -O3  -std=c++2a -stdlib=libc++ -Weverything
#ifdef __clang__
#pragma clang diagnostic ignored "-Wc++98-compat"
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic warning "-Wunreachable-code"
#else
#pragma warning( default: 4702 )
#endif

#ifdef __clang__
#define DISABLE_WARNING_UNREACHABLE  _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wunreachable-code\"")
#define REENABLE_WARNING_UNREACHABLE _Pragma("clang diagnostic pop")
#else
#define DISABLE_WARNING_UNREACHABLE   __pragma(warning(push)) __pragma(warning( disable : 4702 ))
#define REENABLE_WARNING_UNREACHABLE  __pragma(warning(pop))
#endif

[[noreturn]] void g();
#define MY_UNREACHABLE(msg) DISABLE_WARNING_UNREACHABLE; g() REENABLE_WARNING_UNREACHABLE 

[[noreturn]] void my_exit(int);
[[noreturn]] void f()
{
    my_exit(0);
    //g(); // Test if warning works without the macro
    MY_UNREACHABLE("Custom message");
}

Воспроизведение в Compiler Explorer

Насколько я понимаю из [документации Microsoft] (https://docs.microsoft.com/en-us/cpp/preprocessor/pragma-directives-and-the-pragma-keyword?view=vs-2019), Я должен иметь возможность использовать __pragma с этим предупреждением push/pop, чтобы отключить это предупреждение при вызове моего макроса. (У него даже есть пример)

Что здесь нужно изменить, чтобы подавить предупреждение в MSVC?


person JVApen    schedule 11.05.2019    source источник
comment
Дубликат может быть старым, но ответ по-прежнему актуален gcc.godbolt.org/z/oXmPRl - Похоже на ограничение MSVC   -  person StoryTeller - Unslander Monica    schedule 12.05.2019
comment
И обновленная документация по-прежнему говорит то же самое. docs.microsoft.com/en-us/cpp/ препроцессор/предупреждение?view=vs-2019   -  person StoryTeller - Unslander Monica    schedule 12.05.2019
comment
Спасибо, вместо этого мне придется использовать простые комментарии   -  person JVApen    schedule 12.05.2019