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

Какова цель __in __out __in_opt __allowed(), как они работают? Должен ли я использовать подобные конструкции в своем собственном коде?

Некоторые из этих определений препроцессора находятся в функции WinMain и других библиотеках Windows. В чем их цель? Как они работают? и правильно ли писать их в свои реализации или вызовы функций?

Мои первоначальные исследования показывают, что они просто настроены на equlivalent:

#define __in 
#define __out
#define __in_opt

Значение означает, что они не заменяются ничем на проходе препроцессора. Являются ли они просто методом документации, без каких-либо функциональных возможностей?

Если это так, я вижу преимущество документирования кода в строке следующим образом. С чем-то вроде doxygen вам нужно записать имена параметров дважды. Таким образом, это теоретически может помочь уменьшить дублирование и поддерживать согласованность...

У меня нет теории о том, как __allowed() должен работать.

4b9b3361

Ответ 1

Это аннотации SAL в языке аннотаций исходного кода. От этого зависит инструмент Microsoft. Статья библиотеки MSDN приведена здесь. Хорошим примером является Анализ кода. Другим совершенно несвязанным инструментом, но уполномоченным этими аннотациями, является помощник помощника Pinvoke.

Ответ 2

Аннотации SAL полезны для двух вещей:

  • Статический анализ через PREfast (скомпилировать/проанализировать)
  • Человеческие читатели могут посмотреть аннотации и выяснить, как следует вызывать функцию, и быстро определять параметры ввода/вывода.

Макросы фактически расширяются до различных выражений declspec, когда ваш код скомпилирован с анализом. Я все время использую эти аннотации в своем коде.

Ответ 3

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

Ответ 4

Эти макросы Microsoft обычно расширяются до нуля и означают как подсказки для читателя.

Однако в прошлый раз я проверил, например. намек на аргументы MessageBox был совершенно неправильным, намекая, что первый, второй и третий аргументы имели полезные значения по умолчанию (когда вы указываете 0), тогда как на самом деле это первый и четвертый аргументы, которые имеют полезные значения по умолчанию. Возможно, также аргумент заголовка, который по умолчанию имеет значение "Ошибка", но я никогда не нашел его полезным. Итак, это всего лишь вещь Microsoft, намекает, что вы не можете и не должны полагаться, просто вводить в заблуждение визуальный беспорядок.

Приветствия и hth.,