c++ - usar - metodos y funciones en c#
CompilaciĆ³n fallida si el valor de retorno no se utiliza para cierto tipo (3)
Es posible que le resulte más fácil utilizar una herramienta de análisis de código para escanear el código fuente.
Esto podría permitirle usar el tipo de devolución, tal como lo solicitó, o un marcador diferente para que las funciones lo prueben, como un comentario, para indicar qué funciones deben verificarse.
Puede ejecutar la herramienta de análisis como parte del proceso de compilación o como parte de un servidor de compilación.
Me gustaría hacer que la compilación falle para algunas llamadas a funciones pero no para otras. La llamada a la función que deseo fallar son aquellas que no manejan los valores devueltos cuando el valor es de un cierto tipo. En el ejemplo siguiente, no manejar una función que devuelve Error
es un error de compilación, pero no manejar una función que devuelve algo más debería tener éxito.
Nota: nuestro entorno de ejecución (incrustado) no nos permite utilizar las siguientes construcciones: RTTI, excepciones.
Este código solo necesita compilar con Clang, preferiría no tener que anotar cada función.
Preferimos una solución que falla en tiempo de compilación en lugar de en tiempo de ejecución.
enum class Error {
INVAL,
NOERR,
};
// do something that can fail.
Error DoThing();
// may return different return codes, we never care (we can''t change prototype)
int DoIgnoredThing();
int main() {
DoThing(); // compilation failure here, unused "Error" result
DoIgnoredThing(); // compilation succeeds, OK to ignore unused "int" result
return 0;
}
Intenté algunas maneras de hacer una clase que hiciera lo que quisiera, pero no he tenido éxito. ¿Ha considerado hacer su "valor de retorno" un argumento pasado por referencia? Esa es la forma más común en que he visto que las API te obligan a prestar atención al valor de retorno. Entonces, en lugar de
Error DoThing();
tienes
void DoThing(Error& e);
Todo lo que llama DoThing () tiene que pasar en un objeto Error o obtendrá un error de compilación. Nuevamente, no es exactamente lo que pediste, ¿pero quizás lo suficientemente bueno?
No sé de una manera de hacerlo con C ++ directo, pero si está usando g ++ puede usar el atributo warn_unused_result junto con el indicador de línea de comandos -Werror = unused-result. Consulte la documentación del resultado warn_unused para saber cómo especificarlo (desafortunadamente deberá especificarlo en cada función, no creo que pueda especificarlo para un tipo). Entonces, la bandera del compilador convertirá esa advertencia en un error.
Si no está usando g ++, su compilador puede tener una funcionalidad similar.