当从不同类型的外部库中读取函数的文档时,我总是看到文档声明变量必须是[IN/OUT].有人可以让我详细了解[IN/OUT]如何与通过引用或值传递的函数的参数相关.
这是我遇到的一个函数示例,告诉我它需要一个[IN/OUT]参数:
原型: ULONG GetActivationState(ULONG*pActivationState);
参数
此参数是in/out,因为您提供了在函数内部使用的值,并且函数修改它以通知您函数内部发生的事情.这个函数的用法是这样的:
ULONG activationState = 1; // example value
ULONG result = GetActivationState(&activationState);
Run Code Online (Sandbox Code Playgroud)
请注意,您必须提供变量的地址,以便函数可以获取值并在函数外部设置值.例如,该GetActivationState函数可以执行以下操作:
ULONG GetActivationState(ULONG* pActivationState)
{
if (*pActivationState == 1)
{
// do something
// and inform by the modification of the variable, say, resetting it to 0
*pActivationState = 0;
}
// ...
return *pActivationState; // just an example, returns the same value
}
Run Code Online (Sandbox Code Playgroud)
请注意:
activationState保存新值的变量(在这种情况下为0).这是"通过引用传递"的示例,它通过使用C中的指针(以及C++中的引用)来执行.
通常,标记为IN/OUT的内容将通过非const指针或引用传递,允许函数直接修改变量,并读取它.请务必检查文档,看看它是否希望在传入之前设置该值.
标记为IN的参数将通过值传递,或通过常量指针或常量引用传递,禁止函数修改变量.
C++不强制使用仅OUT参数,但通常它们将使用非常量指针或引用传递,类似于IN/OUT.
这部分适用于所有类型的参数-大多数库接口都试图与C兼容,因此更常见的是通过指针而不是通过引用传递参数。
IN:当参数列为IN时,接口将保证不会修改该参数。在我看来,最好通过将参数标记为来传达这一点const,然后语言本身将阻止对值的修改。如果此参数是按值传递的,则在文档中将其标记为IN(或在原型中为const)都是无关紧要的,因为无论如何该参数对于函数而言都是本地的。但是为了避免复制,它可以通过引用或指针传递,在这种情况下,const关键字变得非常重要。
OUT:标记为OUT的参数通常表示将参数传递给函数时的值不重要。实际上,如果通过指针传递它,甚至可能要求它为NULL,并且该函数将分配内存并将值传递回给您。
输入/输出:输入/输出参数通常表示输入和输出值均有意义的内容。例如,如果您有一个填充缓冲区的库函数,则可能需要将一个指针与另一个指示缓冲区长度的指针一起传递给缓冲区。当函数返回时,第二个指针可能包含已写入缓冲区的实际字节数。
如果参数是 OUT,则必须通过引用传递。如果复制成本太高,纯 IN 参数通常会按值或 const 引用传递(没有什么可以阻止设计者通过引用传递它,但恕我直言,这不是很好的设计)。IN/OUT 参数必须通过引用传递。