MSVC SAL vs. C ++ 2a Контракт

В MSVC есть Функция SAL, который может использоваться для описания параметра, результата и т. д., и он работает хорошо, и переносимость также хороша, функция контракта C ++ 2a, кажется, делает то же самое, может кто-нибудь дать некоторые различия между ними?

1

Решение

Нет реального совпадения между SAL и контрактами. SAL — это аннотирование параметров и возвращаемых значений для описания некоторых аспектов того, как функция использует их. Контракты об описании того, что функция требует его параметров и что может ожидать вызывающая сторона возвращаемого значения. Эти звуки похожи, но они очень разные.

Например, SAL имеет представление о том, является ли параметр входным, выходным или входным / выходным параметром. Это вопрос того, что функция делает с параметрами. Контракты не имеют такого понятия, потому что их не волнует, что функция делает с параметром.

Теперь есть некоторые совпадения. Иногда то, что ожидает функция и что функция выравнивает. Например, если функция ожидает, что параметр указателя не будет nullptr, вы бы применить [[expects: param != nullptr]] контракт на эту функцию. Тем не менее, SAL понятие _In_ Примечания к параметру указателя охватывают ту же общую идею: если функция использует параметр в качестве действительного указателя на объект, то, естественно, он не может быть nullptr, Так _In_ защищает от этого.

В конечном итоге SAL описывает, как функция использует данные; контракты о функции интерфейс с вызывающим кодом.

Кроме того, SAL чрезвычайно ограничен в том, что вы можете выразить. У него есть несколько сложных операторов, таких как «строка с нулевым символом в конце», но у него нет основы, на которой вы можете строить свои собственные. Контракты являются выражениями C ++, и поэтому они могут проверять что-нибудь что выражение C ++ может проверить.

2

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

Других решений пока нет …

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