Какова цель __in __out __in_opt __allowed(), как они работают? Должен ли я использовать аналогичные конструкции в моем собственном коде?
Некоторые из этих определений препроцессора находятся в функции WinMain и других функциях библиотеки Windows. Какова их цель? Как они работают? и это хорошая практика, чтобы записать их в свои реализации или вызовы функций?
Мое первоначальное исследование показывает, что они просто настроены так:
#define __in
#define __out
#define __in_opt
Это означает, что они заменяются ничем на проходе препроцессора. Это просто метод документации, без какой-либо функциональности?
Если это так, я вижу преимущество документирования кода в такой строке. С чем-то вроде doxygen вам нужно дважды выписать имена параметров. Так что теоретически это может помочь уменьшить дублирование и сохранить последовательность...
У меня нет теории о том, как __allowed()
должен работать.
4 ответа
Это аннотации SAL на языке аннотаций исходного кода. Инструменты Microsoft зависят от этого. Статья библиотеки MSDN находится здесь. Хорошим примером является анализ кода. Другим совершенно не связанным инструментом, но усиленным этими аннотациями, является Pinvoke Interop Assistant.
Аннотации SAL полезны для двух вещей:
- Статический анализ через PREfast (компилировать с / анализировать)
- Люди-читатели могут посмотреть аннотации и выяснить, как должна вызываться функция, и быстро определить параметры ввода / вывода.
Макросы действительно расширяются до различных выражений declspec, когда ваш код компилируется с последующим анализом. Я использую эти аннотации все время в своем коде.
Они используются в инструменте семантического анализа Microsoft в качестве разметки кода. Если вы не планируете использовать этот инструмент самостоятельно, их использование не имеет смысла.
Эти макросы Microsoft обычно расширяются до нуля и служат подсказками для читателя.
Тем не менее, в прошлый раз я проверял, например, намеки на MessageBox
Аргументы были совершенно неверными, намекая на то, что первый, второй и третий аргументы имеют полезные значения по умолчанию (когда вы указываете 0), тогда как в действительности это первый и четвертый аргументы, которые имеют полезные значения по умолчанию. Возможно также аргумент заголовка, который по умолчанию равен "Ошибка", но я никогда не находил это полезным. Так что это просто вещь Microsoft, намеки на которую вы не можете и не должны полагаться, просто вводя в заблуждение визуальный беспорядок.
Ура & hth.,