除了这可能会让所有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_
参数