1

除了这个事实,它可能会让每个 Windows C++ 开发人员感到困惑,

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

所以

int DoSomething( _In_ int * pInput);

变成

int DoSomething( const int * pInput);

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


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

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

4

2 回答 2

1

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

以下是扩展_In_至的一些问题const

  • 以前没见过 SAL 注解的程序员会更加困惑。
  • 然后,这些程序员将编写_In const int*并可能得到编译器错误,具体取决于编译器是否诊断出 double const。
  • 程序员想要在函数内部修改的按值参数很烦人。
  • 这对 COM 接口指针来说是灾难性的。COM 接口永远不会有const成员(因为这是 C++ 特有的东西)。这意味着指向 const 接口的指针绝对没有用。但是您仍然会经常传递接口类型_In__In_opt_参数。
于 2014-11-11T12:13:44.860 回答
1

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

void f( _In_ X x) { g(++x); // ok to modify }
于 2014-11-11T11:03:02.797 回答