将 _In_ 扩展为 const

Posted

技术标签:

【中文标题】将 _In_ 扩展为 const【英文标题】:Expand _In_ to const 【发布时间】:2014-11-11 10:53:51 【问题描述】:

除了这个事实,它可能混淆那里的每个 windows c++ 开发人员,

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

所以

int DoSomething( _In_ int * pInput);

变成

int DoSomething( const int * pInput);

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


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

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

【问题讨论】:

不是真正的问题,为什么参数首先是指针? 没有。而是,我可以(与预编译器合作)确定以下参数是否真的是一个指针。 @SebastianRedl:我不认为boost::optional<> 将其纳入 C++11 规范(尽管cppreference has a related entry?,所以有什么方便的替代方法可以传递一个没有的可选参数一个方便的哨兵值,为什么它总是更好? @TonyD: optional 没有成功,甚至在 14 中也没有。但是 SAL 有一个单独的注释来表示“这是一个指针,因为它是可选的”:_In_opt_。由于示例中的参数只是_In_,我很好奇。 @MrPaulch 预处理器永远不会与你合作,尤其是在类型问题上,因为它纯粹在令牌上运行。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于将 _In_ 扩展为 const的主要内容,如果未能解决你的问题,请参考以下文章

将矩阵扩展为块矩阵 - 索引问题

Yii2 - 将控制器扩展为现有模块

我可以将 Enum 扩展为 Enum.GetValues() 吗? [复制]

Flutter 如何将小部件扩展为具有更多内容的更大小部件?

预处理器宏扩展为另一个预处理器指令

将 vue-material 组件扩展为我自己的组件