¿Qué valor de retorno debe utilizar para una llamada de función fallida en C?

Posible duplicado:
Manejo de errores en código C

Digamos que tienes una función:

int MightWork(){ // if it works return x; // if it fails return y; } 

¿Qué deberían ser x y y?

Porque tengo otra función:

 if (MightWork){ // do stuff #1 }else{ // do stuff #2 } 

Sé que para este ejemplo en particular, usar un valor de retorno de 1 tomará el segundo bloque de código para “hacer cosas # 1” y usar un valor de retorno de 0 tomará el segundo bloque de código para “hacer cosas # 2”

Mi pregunta es ¿cuál es el estilo preferido en C para hacer esto? ¿Un valor de retorno de 0 para una función indica éxito y cualquier otro valor indica falla? ¿O viceversa? ¿O valores por debajo de 0?

Me gustaría asegurarme de que estoy escribiendo mi código C con el estilo actual. ¡Gracias!

Para el éxito / error no puntero:

  • 0 => éxito
  • -1 => fallar

Para las funciones de puntero:

  • NULL => fail
  • todo lo demás => éxito

En un contexto condicional, los enteros se evalúan como “verdaderos” si no son cero y “falsos” si son cero, por lo que debe devolver 0 en caso de fallo si desea usar la función de esa manera, y asegúrese de no devolver 0 En la twig exitosa.

Ambos se utilizan, y generalmente depende de si se pueden devolver múltiples códigos de error.

Si su función solo “triunfará” o “fallará” sin información adicional, le recomendaría que devuelva 0 por fallo y 1 por éxito, porque es más simple y más semánticamente válido.

Si su función puede fallar con varios códigos de estado, la única manera de ir es tener 0 para el éxito y otros valores para el fallo que representan diferentes estados.

No hay una respuesta correcta.

Si su función se nombra / documenta como evaluación de un predicado de algún tipo, entonces debe devolver un valor distinto de cero (1 si es conveniente) para “verdadero” y 0 para falso.

Si su función devuelve un puntero, 0 (puntero nulo) es la única forma razonable de informar un error. Las convenciones como devolver (void *)-1 , MAP_FAILED , SEM_FAILED , y tales son horribles y no deben copiarse. Si necesita informar un motivo del error, agregue un argumento extra int *errorcode e incluya if (errorcode) *errorcode = reason; al final de su función para permitir que las personas que llaman no se preocupen por la razón para pasar un puntero nulo.

Si su función devuelve un valor numérico tal que solo ciertos valores de rango tienen sentido (por ejemplo, solo enteros no negativos, o solo valores de punto flotante finitos), entonces use valores fuera de rango para códigos de error (por ejemplo, enteros negativos o NaN / infinito ) como códigos de error. Si no tiene suficientes códigos posibles (por ejemplo, solo NaN), use el método int *errorcode descrito anteriormente.

Históricamente, un valor de retorno de 0 generalmente indica éxito, mientras que un valor de retorno de -1 indica falla. También puede usar más valores de salida para proporcionar al usuario de la función información más detallada sobre el estado de retorno. Otra tradición es establecer una variable de código de error global, ver, por ejemplo, GetLastError y SetLastError en Windows.

1 = verdadero 0 = falso

en general….

a veces la gente usa -1 para “error”

Otra forma de manejar esto es con enumeraciones y, a veces, # define. Aunque muchas veces la gente no usa esto a menos que haya muchos errores … y generalmente varios errores son manejados por varios números negativos.

En mi opinión ambos podrían funcionar, pero en caso diferente.

  1. Si realiza la función para realizar alguna operación, devuelva 0 para éxito, -1 para error y establezca errno en el valor apropiado para que la persona que llama pueda verificarlo para conocer el detalle de la falla. Algunas veces las personas también usan diferentes valores de retorno para significar diferentes fallas.

  2. Si desea que la función pruebe alguna condición, debe hacer que devuelva TRUE o FALSE , y use if (XXX() == TRUE) más adelante. La forma de if (XXX()) no se recomienda, aunque muchas personas lo hacen para ahorrar tiempo al teclear. TRUE y FALSE no es un tipo de datos incorporado en C, sin embargo, muchos entornos de progtwigción lo definirán como TRUE = 1 y FALSE = 0 , puede hacerlo usted mismo si no está trabajando en dicho entorno.

use #define.

 #define TRUE 1 #define FALSE 0 

esto ayuda a cualquier otra persona a comprender su elección de estándar para valor verdadero y falso. Además, si el código del progtwig aumenta de tamaño, el seguimiento de las constantes se vuelve difícil y puede confundir. Usar #define para constantes es siempre una buena práctica.