minwindef.h中的IN和OUT宏

IN and OUT macros in minwindef.h

本文关键字:OUT IN 中的 minwindef      更新时间:2023-10-16

这些在minwindef.h(通常位于Program Files(x86(\Windows Kits\8.1\Include\shared\minwindef.h(中定义

#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif

我经常看到用这些宏装饰的参数,比如:

void SomeFunction(IN const MyClass& obj)

这些宏的意义是什么?为什么要用它来装饰参数?

为了与Standard C和Standard兼容,这些宏可能被定义为不包含任何内容C++,或者它们可以定义为特定于MS的SAL(Microsoft源代码注释语言(注释用于注释功能参数和返回值,例如

#define IN _In_
#define OUT _Out_

具有文档化的含义:

_In_

对标量、结构、指向结构的指针等输入参数进行注释。显式可以用于简单标量。参数必须在预状态下有效,并且不会被修改。

_Out_

对标量、结构、指向结构的指针等输出参数进行注释。不要将其应用于无法返回值的对象——例如,按值传递的标量。参数在前状态下不必有效,但在后状态下必须有效。

SAL注释当然是由MS编译器解析的。MSDN Windows API文档使用SAL注释,例如

从它们的定义中可以看出,这些宏没有任何功能用途。

它们仅用于文档目的,以表明函数的逻辑语义期望(例如(obj是"in"参数,而不是"out"参数。

C#有实际的关键字inout,所以Windows代码中可能包含了这些等价的"一致性"…不过,就我个人而言,我认为拥有实际上没有任何作用的"等价物"可能弊大于利。

但是,嘿,你是为微软工作的人,所以也许可以告诉我们。:(