在MSVC中,有SAL特性,可以用来描述参数,结果等,效果很好,可移植性也不错,C++2a Contract特性好像也是这样,谁能给点他们之间的区别?
问问题
201 次
1 回答
4
SAL 和合同之间没有真正的重叠。SAL 是关于注释参数和返回值以描述函数如何使用它们的某些方面。关于描述函数对其参数的要求以及调用者对返回值的期望的合同。这些听起来很相似,但它们却大不相同。
例如,SAL 具有参数是输入、输出还是输入/输出参数的概念。这与函数对参数的作用有关。合约没有这样的概念,因为它们不关心函数对参数的作用。
现在有一些重叠。有时,函数所期望的和函数所做的对齐。例如,如果一个函数期望指针参数不是nullptr
,您可以将[[pre: param != nullptr]]
协定应用于该函数。但是,_In_
指针参数注释的 SAL 概念涵盖了相同的一般思想:如果函数将参数用作指向对象的有效指针,那么它自然不能是nullptr
. 所以_In_
保护它。
SAL 最终是关于描述函数如何使用数据的;合同是关于函数与调用代码的接口。
此外,SAL 在您可以表达的内容方面极为有限。它有一些复杂的语句,例如“是一个以空字符结尾的字符串”,但它没有您可以构建自己的基础。契约是 C++ 表达式,因此它们可以验证 C++ 表达式可以验证的任何内容。
于 2018-12-15T15:49:57.167 回答