c++ - ¿Cuál es el propósito de __in __out __in_opt __allowed(), cómo funcionan? ¿Debo usar construcciones similares en mi propio código?



com winmain (5)

Estas macros de Microsoft generalmente se expanden a nada, y están pensadas como sugerencias para el lector.

Sin embargo, la última vez que verifiqué, por ejemplo, la sugerencia de los argumentos de MessageBox fue completamente errónea, aludiendo que el primer, segundo y tercer argumento tenían valores predeterminados útiles (cuando se especifica 0), mientras que en realidad el primer y cuarto argumento tienen valores predeterminados útiles. Tal vez también el argumento del título, que por defecto es "Error", pero nunca lo encontré útil. Por lo tanto, es solo una cosa de Microsoft, insinuaciones de que no puedes y no debes confiar, solo un desorden visual engañoso.

Salud y salud,

Algunas de estas definiciones de preprocesador se encuentran en la función WinMain y otras funciones de la biblioteca de Windows. ¿Cuál es su propósito? ¿Cómo trabajan? ¿Es una buena práctica escribirlas en sus implementaciones o llamadas a funciones?

Mi investigación inicial sugiere que simplemente se configuran como equivalentes a:

#define __in 
#define __out
#define __in_opt

Lo que significa que se reemplazan con nada en el pase de preprocesador. ¿Son solo un método de documentación, sin ninguna funcionalidad?

Si es así, puedo ver la ventaja de documentar el código en línea como este. Con algo como doxygen necesitas escribir los nombres de los parámetros dos veces. Entonces, en teoría, esto podría ayudar a reducir la duplicación y mantener la consistencia ...

No tengo ninguna teoría de cómo se supone que __allowed() funciona.


Las anotaciones SAL son útiles para dos cosas:

  • Análisis estático a través de PREfast (compilar con / analizar)
  • Los lectores humanos pueden ver las anotaciones y descubrir cómo se debe llamar a una función, y determinar rápidamente los parámetros de entrada / salida.

De hecho, las macros se expanden a varias expresiones declpec cuando su código se compila con el análisis activado. Yo uso estas anotaciones todo el tiempo en mi código.


Son anotaciones SAL en el lenguaje de anotación de código fuente. Las herramientas de Microsoft dependen de ello. El artículo de MSDN Library está aquí . Un buen ejemplo es el análisis de código . Otra herramienta bastante no relacionada, pero habilitada por estas anotaciones es el Asistente de interoperabilidad de Pinvoke.


Se utilizan en una herramienta de análisis semántico de Microsoft como marcas de código. A menos que planee usar esta herramienta usted mismo, no tiene ningún propósito usarlas.


N3690 es un antiguo borrador del comité para C ++ 14; se han realizado cambios masivos desde entonces (por ejemplo, la eliminación de <optional> y <dynarray> ), y no debe utilizarse para nada más que quizás la arqueología estándar.

N3936 es la versión que se envía para la votación final (bueno, la versión que se envía en realidad es N3937, pero la diferencia es básicamente una portada elegante). Eso, con algunas correcciones editoriales menores , se convirtió en el C ++ 14 IS.

N4140 es para C ++ 14 lo que N3337 es para C ++ 11 - C ++ 14 más algunos cambios editoriales.

N4296 es un borrador de trabajo posterior que incorpora propuestas adicionales votadas en la norma.





c++ c com winmain