将_In_扩展为常量

Expand _In_ to const

本文关键字:常量 In 扩展      更新时间:2023-10-16

除了这可能会让所有windows c++开发人员感到困惑之外,

_In_扩展为强制性的const(如果还没有)以确保常量的正确性,这不是很谨慎吗?

所以

int DoSomething( _In_ int * pInput);

成为

int DoSomething( const int * pInput);

显然,_[In]Out_仍然应该扩展到nothing


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

因此,也许一个简单的宏观扩张是不够的。我现在还不想放弃强制执行const的概念。座右铭是:我们已经有了SAL表示法,它告诉我们什么参数是ro,什么不是,让我们利用它

假设它是一个宏扩展,那么对于复制到参数中的值(即)来说就不起作用

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

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

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

  • 以前没有看过SAL注释的程序员会特别困惑
  • 然后,这些程序员将编写_In const int*,并可能得到编译器错误,这取决于编译器是否诊断为双常量
  • 对于程序员想要在函数内部修改的按值参数来说,这很烦人
  • 这对COM接口指针来说是灾难性的。COM接口从来没有const成员(因为这是一件非常特定于C++的事情)。这意味着指向const接口的指针是绝对无用的。但是,您仍然会经常传递接口类型的_In__In_opt_参数