Подтвердить что ты не робот

MSVC эквивалент __attribute__ ((warn_unused_result))?

Я нахожу __attribute__ ((warn_unused_result)) очень полезным в качестве средства поощрения разработчиков не игнорировать коды ошибок, возвращаемые функциями, но мне нужно это для работы с MSVC, а также с gcc и gcc-совместимыми компиляторами, такими как ICC. У компиляторов Microsoft Visual Studio C/С++ есть эквивалентный механизм? (Я пробовал пробираться через MSDN без какой-либо удачи.)

4b9b3361

Ответ 1

Это _Check_return_. См. здесь для примеров подобных аннотаций и здесь для поведения функции, Он поддерживается с MSVC 2012.

Пример:

_Check_return_
int my_return_must_be_checked() {
    return 42;
}

Ответ 2

ОБНОВЛЕНИЕ ДЛЯ MSVC 2012 И ПОСЛЕ

Большое спасибо @Albert за указание, что MSVC теперь поддерживает аннотацию _Check_return_ по сравнению с Visual Studio 2012 при использовании статического анализа кода SAL. Я добавляю этот ответ, чтобы включить кросс-платформенный макрос, который может быть полезен другим:

#if defined(__GNUC__) && (__GNUC__ >= 4)
#define CHECK_RESULT __attribute__ ((warn_unused_result))
#elif defined(_MSC_VER) && (_MSC_VER >= 1700)
#define CHECK_RESULT _Check_return_
#else
#define CHECK_RESULT
#endif

Обратите внимание, что, в отличие от gcc и др., (a) MSVC требует аннотаций как для объявления, так и для определения функции, и (b) аннотация должна быть в начале объявления/определения (gcc позволяет либо). Поэтому использование обычно должно быть, например:


// foo.h

CHECK_RETURN int my_function(void); // declaration


// foo.c

CHECK_RETURN int my_function(void)  // definition
{
    return 42;
}


Также обратите внимание, что для компиляции из командной строки вам понадобится /analyze (или -analyze), или эквивалент, если используется среда Visual Studio IDE. Это также замедляет процесс сборки.

Ответ 3

Некоторые выпуски VisualStudio поставляются с инструментом статического анализа, который раньше назывался PREFast (теперь он просто называется "Code Analysis for C/С++" ). PREFast использует аннотации для разметки кода. Одна из этих аннотаций, MustCheck, делает то, что вы ищете.

Ответ 4

Насколько мне известно, компиляторы MS не имеют эквивалентной прагмы или атрибута - единственным предупреждением типа "неиспользуемый", которое вы можете получить, является переменная, когда вы включили оптимизатор с соответствующим уровнем предупреждения.