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