MSVC SAL 与 C++2a 契约
MSVC SAL vs. C++2a Contract
MSVC中有SAL feature,可以用来描述参数,结果等,效果不错,可移植性也不错,C++2a Contract feature好像可以同样的事情,有人能说说他们之间的区别吗?
SAL 和合同之间没有真正的重叠。 SAL 是关于注释参数和 return 值,用于描述函数如何使用它们的某些方面。关于描述函数 需要 参数以及调用者对 return 值的期望的约定。这些听起来很相似,但它们有很大的不同。
例如,SAL 具有参数是输入、输出还是 in/out 参数的概念。这是函数对参数执行的操作的问题。合约没有这样的概念,因为它们不关心函数对参数做了什么。
现在有一些重叠。有时,一个函数期望什么和一个函数确实对齐。例如,如果一个函数期望一个指针参数不是 nullptr
,您可以对该函数应用一个 [[pre: param != nullptr]]
契约。然而,_In_
指针参数注释的 SAL 概念涵盖了相同的一般思想:如果函数使用参数作为指向对象的有效指针,那么它自然不能是 nullptr
。所以 _In_
可以防止这种情况发生。
SAL 最终是关于描述函数如何使用数据;合同是关于函数的接口与调用代码。
此外,SAL 可以表达的内容非常有限。它有一些像 "is a null-terminated string" 这样的复杂语句,但它没有您可以构建自己的语句的基础。合约是 C++ 表达式,因此它们可以验证 C++ 表达式可以验证的任何内容。
MSVC中有SAL feature,可以用来描述参数,结果等,效果不错,可移植性也不错,C++2a Contract feature好像可以同样的事情,有人能说说他们之间的区别吗?
SAL 和合同之间没有真正的重叠。 SAL 是关于注释参数和 return 值,用于描述函数如何使用它们的某些方面。关于描述函数 需要 参数以及调用者对 return 值的期望的约定。这些听起来很相似,但它们有很大的不同。
例如,SAL 具有参数是输入、输出还是 in/out 参数的概念。这是函数对参数执行的操作的问题。合约没有这样的概念,因为它们不关心函数对参数做了什么。
现在有一些重叠。有时,一个函数期望什么和一个函数确实对齐。例如,如果一个函数期望一个指针参数不是 nullptr
,您可以对该函数应用一个 [[pre: param != nullptr]]
契约。然而,_In_
指针参数注释的 SAL 概念涵盖了相同的一般思想:如果函数使用参数作为指向对象的有效指针,那么它自然不能是 nullptr
。所以 _In_
可以防止这种情况发生。
SAL 最终是关于描述函数如何使用数据;合同是关于函数的接口与调用代码。
此外,SAL 可以表达的内容非常有限。它有一些像 "is a null-terminated string" 这样的复杂语句,但它没有您可以构建自己的语句的基础。合约是 C++ 表达式,因此它们可以验证 C++ 表达式可以验证的任何内容。