За исключением того факта, что это, вероятно, спутать каждый разработчик Windows C ++ там,
не было бы разумно расширить _In_
в обязательном порядке const
(если еще не присутствует) для обеспечения правильности const?
Так
int DoSomething( _In_ int * pInput);
становится
int DoSomething( const int * pInput);
Очевидно, что _ [In] Out_ все еще должен расширяться до ничего такого.
редактировать: Очевидно, что первая проблема заключается в том, что это имеет смысл только при расширении спереди указателя или ссылочного параметра.
Так что, возможно, простого расширения макроса будет недостаточно. Я не хочу отказываться от понятия принуждения const
только пока. Девиз: у нас уже есть SAL
запись, которая говорит нам, что параметр ro
а что нет, давайте использовать его.
Предполагая, что это расширение макроса, оно не будет работать для значений, скопированных в параметры, т.е.
void f( _In_ X x) { g(++x); // ok to modify }
Вы должны научить своих программистов использовать const
для параметров указателя / ссылки, которые должны быть неизменными, даже если используется аннотация SAL.
Вот некоторые проблемы с расширением _In_
в const
:
_In const int*
и возможно получить ошибку компилятора, в зависимости от того, диагностирует ли компилятор двойной констант.const
члены (потому что это очень специфичная для C ++ вещь). Это означает, что указатель на интерфейс const абсолютно бесполезен. Но вы все еще, довольно часто, проходите _In_
или же _In_opt_
параметры типа интерфейса.