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++.