Развернуть _In_, чтобы const

За исключением того факта, что это, вероятно, спутать каждый разработчик Windows C ++ там,

не было бы разумно расширить _In_ в обязательном порядке const (если еще не присутствует) для обеспечения правильности const?

Так

int DoSomething( _In_ int * pInput);

становится

int DoSomething( const int * pInput);

Очевидно, что _ [In] Out_ все еще должен расширяться до ничего такого.


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

Так что, возможно, простого расширения макроса будет недостаточно. Я не хочу отказываться от понятия принуждения const только пока. Девиз: у нас уже есть SAL запись, которая говорит нам, что параметр ro а что нет, давайте использовать его.

1

Решение

Предполагая, что это расширение макроса, оно не будет работать для значений, скопированных в параметры, т.е.

void f( _In_ X x) { g(++x); // ok to modify }
1

Другие решения

Вы должны научить своих программистов использовать const для параметров указателя / ссылки, которые должны быть неизменными, даже если используется аннотация SAL.

Вот некоторые проблемы с расширением _In_ в const:

  • Программисты, которые раньше не видели аннотации SAL, очень запутаны.
  • Эти программисты потом напишут _In const int* и возможно получить ошибку компилятора, в зависимости от того, диагностирует ли компилятор двойной констант.
  • Это раздражает для параметров по значению, которые программист хочет изменить внутри функции.
  • Это катастрофично для указателей интерфейса COM. COM-интерфейсы никогда не имеют const члены (потому что это очень специфичная для C ++ вещь). Это означает, что указатель на интерфейс const абсолютно бесполезен. Но вы все еще, довольно часто, проходите _In_ или же _In_opt_ параметры типа интерфейса.
1

По вопросам рекламы [email protected]