将_In_展开为const

时间:2014-11-11 10:53:52

标签: c++ const-correctness sal

除了事实,它可能混淆每个Windows c ++开发人员,

_In_扩展为强制const(如果尚未存在)以确保常规正确性是不谨慎的?

所以

int DoSomething( _In_ int * pInput);

变为

int DoSomething( const int * pInput);

显然_ [In] Out_仍应扩展为 nothing


编辑:显然第一个问题是,这只在扩展指针或参考参数的前面时才有意义。

所以也许简单的宏扩展是不够的。我还不想放弃执行const的概念。座右铭是:我们已经有一个SAL符号告诉我们什么参数是ro,什么不是,让我们使用它。

2 个答案:

答案 0 :(得分:1)

假设它是一个宏扩展,那对复制到参数中的值不起作用,即

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

答案 1 :(得分:1)

即使使用了SAL注释,您也应该培训程序员使用const作为不可变的指针/引用参数。

以下是将_In_扩展为const的一些问题:

  • 之前没有看过SAL注释的程序员更加困惑。
  • 然后这些程序员将编写_In const int*并可能会遇到编译器错误,具体取决于编译器是否诊断为double const。
  • 程序员想要在函数内修改的值参数很烦人。
  • 这对COM接口指针来说是灾难性的。 COM接口永远不会有const个成员(因为这是一个特定于C ++的东西)。这意味着指向const接口的指针绝对没用。但是,您经常会传递接口类型的_In__In_opt_个参数。