Esta parte se aplica a todos los tipos de parámetros: la mayoría de las interfaces de biblioteca intentan ser compatibles con C, por lo que es más común pasar parámetros por puntero que por referencia.
IN: Cuando un parámetro se enumera como IN, la interfaz ofrece una garantía de que no modificará ese parámetro. En mi opinión, esto se transmite mejor marcando el parámetro como const
, luego el lenguaje mismo evitará modificaciones al valor. Si este parámetro se pasa por valor, no tiene importancia si está marcado IN en la documentación (o const en el prototipo) ya que el parámetro es local para la función de todos modos. Pero para evitar la copia, se puede pasar por referencia o por puntero, en cuyo caso la palabra clave const
se vuelve muy importante.
OUT: Un parámetro marcado OUT generalmente significa que el valor del parámetro cuando se pasa a la función no tiene ninguna importancia. De hecho, si se pasa por un puntero, incluso puede requerirse que sea NULL, y la función asignará memoria y le devolverá un valor.
ENTRADA/SALIDA: Un parámetro IN/OUT generalmente indica algo donde los valores de entrada y salida son significativos. Por ejemplo, si tiene una función de biblioteca que llena un búfer, puede requerir que pase un puntero al búfer, junto con otro puntero que indica la longitud del búfer. Cuando la función retorna, el segundo puntero puede contener la cantidad real de bytes que se han escrito en el búfer.
'Un parámetro IN/OUT se debe pasar por referencia'; excepto en el ejemplo publicado, un parámetro ENTRADA/SALIDA se pasa por un puntero. – Praetorian
@Praetorian: "pasar por referencia" no significa forzosamente que la firma utiliza una referencia de C++ para el parámetro. Significa que la función tiene acceso de escritura a la variable en lugar de una copia del valor de la variable. –
@ André Caron Veo lo que dices, pero no estoy de acuerdo. Si esto fuera C, usaría los términos "pasar por puntero" y "pasar por referencia" de manera intercambiable, pero con C++ hay una diferencia, por lo que creo que la distinción es importante.Tal vez solo soy quisquilloso :-) – Praetorian