Pregunta

Muchas funciones C estándar POSIX y regresan -1 para el error, y 0 en caso de éxito, por ejemplo, truncate , fflush , msync , etc.

int ret = truncate("/some/file", 42);

¿Es mejor práctica para comprobar el éxito con ret != -1 o ret == 0, y por qué?

Mis pensamientos

Es mi experiencia la mayoría de la gente de verificación para el caso de error (ret != -1), ya que normalmente sólo hay uno (tener en cuenta las funciones que NULL retorno o EOF en caso de error). Sin embargo, en retrospectiva, se podría ver estas funciones podrían beneficiarse de regresar errno directamente (donde 0 se considera ningún error).

También existe la preocupación de que una función devuelve algo distinto de 0 o -1, o que los valores de retorno adicionales se añaden más tarde. En estos escenarios, tiene sentido para detectar la gama "más ajustado" de los valores que indica el éxito (ret == 0).

Update0

Es una suposición mía que la gente es consciente de que EOF se define típicamente como -1.

¿Fue útil?

Solución

En mi opinión, lo que realmente depende de lo que tiene que hacer y el rango de valores de retorno.

Tome una llamada con un valor de éxito y muchos valores de fallo. Por lo general es más fácil de == o != contra el valor de retorno éxito que cheque contra cualquier valor de fallo. En este caso, se debe comprobar con respecto a != success si es necesario, por ejemplo, registrar y retorno o lanzar en caso de fallo.

En una llamada con uno y uno, el comportamiento deseado es más importante, por lo que sugiero elegir el más fácil de leer. Si los códigos tiene que reaccionar y posiblemente volver en caso de fallo, a continuación, comprobar si hay == failure en lugar de != success. El primero es más fácil de leer, ya que se necesita un paso de pensar y la constante de fracaso puede ser nombrado amablemente.

También es posible que desee considerar que es más probable y mango que primero, o lo que es numéricamente mayor o menor medida.

En su caso, con dos funciones comparten un código de éxito y con distintos códigos de fallo, corresponde a lo que parece más fácil de leer. Estoy de acuerdo que las pruebas de == 0 en ambos casos parece mejor, pero realmente depende de la cantidad de código que viene entre las llamadas. Si usted tiene un par de docenas de líneas, puede que no haya mucha diferencia en la legibilidad. Si está muy cerca, que incluso podría ser capaz de O los resultados juntos y se ahorrará unos pasos más.

Otros consejos

Depende de si la función es una función de biblioteca C estándar o una función POSIX. funciones de C no tienen un estándar uniforme para los códigos de retorno por lo que haría uso de cualquier prueba que tiene más sentido en una base de caso por caso.

POSIX, por el contrario, es más consistente. Casi todas las funciones POSIX se definen para volver -1 con un código de error más específico disponible en errno. Algunas funciones simplemente devolver 0 para el éxito, mientras que otros tienen una multitud de valores de éxito. Por ejemplo, los descriptores de fichero vuelve open(), read() devuelve el número de bytes leídos, etc.

Para mantener la coherencia me gusta usar siempre la misma prueba al invocar funciones POSIX: No hago la prueba para el éxito, la prueba para el fracaso. funciones POSIX que hoy devuelven -1 en caso de error siempre devolverá exactamente -1, por lo que me gustaría utilizar uno de los dos cheques para todos ellos:

if (ret == -1) {
    perror(...);
}

// or

if (ret < 0) {
    perror(...);
}

(yo prefiero el primero, pero el un segundo más general, no me molesta.)

La comparación de las páginas del manual para truncate y fflush, tanto de retorno 0 en caso de éxito, pero devolver valores diferentes para el error (truncado -> -1, fflush -> EOF). Así que me gustaría comprobar por 0.

directrices Cert parecen preferir la '! = 0' cheque como es válida en muchos de sus fragmentos de código de ejemplo.

Siempre consulte las páginas del manual de códigos de retorno.

Por lo general, el éxito 0 significa, pero existen excepciones como printf().

Comprobar man 2 intro para errnos de error y códigos de llamadas al sistema.

Haga lo que haga, nunca una prueba de acceso directo para el éxito con

if (!ret) 

Es confuso y alguien (incluido usted) malinterpretado más tarde como una prueba para el fracaso. Por lo general es mejor utilizar pruebas explícitas.

Si la definición es que 0 significa éxito, y desea comprobar si hay a continuación, usted debe comprobar la equivalencia a 0. (y esto es por ninguna otra razón que la legibilidad de corte)

Para la mayoría de funciones de la API POSIX, los valores negativos son errores. Así que había prueba de fallos con if (ret < 0).

Mi regla de oro es que las funciones de este tipo de retorno del código de error (o simplemente si se ha producido un error) a través del valor de retorno. Así que, para mí, tiene sentido que un valor de retorno de 0 significa que no había nada de ese tipo para volver y que no se produjo ningún error. Por lo tanto, simplemente comprobar si el valor de retorno de 0 si quiero probar si la función se ha realizado correctamente, y si no lo acaba de comprobar el valor de error era y tratar con él en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top