2011-11-14 10 views
9

Duplicar posible:
Error handling in C code¿Qué valor de retorno debe usar para una llamada de función fallida en C?

Digamos que usted tiene una función:

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

    // if it fails 
    return y; 

} 

cuáles deben ser xey?

porque tengo otra función:

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

Sé que para este ejemplo en particular, el uso de un valor de retorno de 1 tomará el segundo bloque de código para "hacer cosas # 1" y el uso de 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? ¿El 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 estar escribiendo mi código C con el estilo actual. ¡Gracias!

+0

Este hilo disco lo mismo: http://stackoverflow.com/questions/385975/error-handling-in-c-code – Laserallan

Respuesta

15

Para el éxito no puntero/Falla:

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

Para funciones de puntero:

  • NULL => fallar
  • todo lo demás => éxito
+0

¿Ha utilizado -1 como una forma de detectar errores en múltiples llamadas en de una manera compacta? P.ej. 'err + = func1(); err + = func2(); if (err <0) printf ("error"); ' – Brian

+0

Por lo tanto, si el éxito es el valor de retorno 0, entonces serían declaraciones equivalentes:" if (my_function()) "y" if (my_function() == 0) " ? – Paradox

2

Históricamente, un valor de retorno de 0 normalmente indica éxito, mientras que un valor de retorno de -1 indica un error. 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 p. Ej. GetLastError y SetLastError en Windows.

0

1 = true 0 = false

en general ....

veces la gente usa -1 para "error"

otra manera de manejar esto es con enumeraciones y, a veces #defines . Aunque muchas veces la gente no usa esto a menos que haya muchos errores ... y generalmente varios errores manejan múltiples errores.

2

En un contexto condicional, los enteros evalúan "verdadero" si no son cero y "falso" si es cero, por lo que debe devolver 0 si la función no funciona y asegúrese de hacerlo no para devolver 0 en la sucursal exitosa.

2

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

Si su función solo "tendrá éxito" o "fallará" sin información adicional, le recomendaría que devuelva 0 en caso de error y 1 para tener éxito, porque es más simple y semánticamente válido.

Si su función puede fallar con múltiples códigos de estado, la única manera de hacerlo es tener 0 para tener éxito y otros valores para fallas que representen diferentes estados.

-2

uso #define.

#define TRUE 1 
#define FALSE 0 

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

2

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 casi la única forma razonable de informar una falla. Convenciones como devolver (void *)-1, MAP_FAILED, SEM_FAILED, y tales son horribles y no deberían copiarse. Si necesita informar un motivo de error, agregue un argumento int *errorcode adicional e incluya if (errorcode) *errorcode = reason; al final de su función para permitir que los llamadores que no se preocupan por el motivo pasen un puntero nulo.

Si su función devuelve un valor numérico tal que solo ciertos valores de rango tienen sentido (por ejemplo, enteros no negativos o solo valores finitos de coma flotante) utilice 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), utilice el enfoque int *errorcode descrito anteriormente.

0

En mi opinión, ambos podrían funcionar, pero en casos diferentes.

  1. Si realiza la función de hacer alguna operación, devuelve 0 para el éxito, -1 para fallidos, y establecer errno al valor apropiado de manera que la persona que llama pudo comprobar que conocer el detalle de la falta. A veces las personas también usan valores de devolución diferentes para significar diferentes fallas.

  2. Si desea probar la función de alguna condición, debe hacerlo volver ya sea TRUE o FALSE, y utilizar if (XXX() == TRUE) más tarde. No se recomienda el formulario if (XXX()), aunque muchas personas lo hacen para ahorrar tiempo escribiendo teclado. TRUE y FALSE no es un tipo de datos integrado en C, sin embargo, muchos entornos de programación lo definirán como TRUE = 1 y FALSE = 0, puede hacerlo usted mismo si no está trabajando en dicho entorno.

Cuestiones relacionadas