Tengo una función que devuelve el puntero al nombre del día de la semana cuando pasa el número del día de la semana. Tengo la sensación de que hago algo ilegal al usar cadenas definidas globalmente como retorno de función. ¿Es ese estilo aceptable?
const char* const SUN_NAME = "Sun"; const char* const MON_NAME = "Mon"; const char* const TUE_NAME = "Tue"; const char* const WED_NAME = "Wed"; const char* const THU_NAME = "Thu"; const char* const FRI_NAME = "Fri"; const char* const SAT_NAME = "Sat"; char* dayOfWeekToChar(int day) { switch (day) { case SUN_NR : return SUN_NAME; break; case MON_NR : return MON_NAME; break; case TUE_NR : return TUE_NAME; break; case WED_NR : return WED_NAME; break; case THU_NR : return THU_NAME; break; case FRI_NR : return FRI_NAME; break; case SAT_NR : return SAT_NAME; break; default: break; } };Para profundizar en lo que dijo Eugene Sh:
Es legal y aceptable.
Sin embargo, los pondría en una matriz:
EJEMPLO:
const char * DaysOfWeekNames[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; enum DaysOfWeek { SUN_NR, MON_NR,TUE_NR, WED_NR, THU_NR, FRI_NR, SAT_NR }; const char * dayOfWeekToChar(enum DaysOfWeek day) { return DaysOfWeekNames[day]; }Lo que haces está bien, pero debería ser const char* dayOfWeekToChar(int day) , porque devuelves un puntero a const char* y no un puntero a char* .
Podrías hacer esto que es más o menos lo mismo que haces:
const char* dayOfWeekToChar(int day) { static const char* days[] = { "Sun", "Mon", ... }; return days[day]; } Sin embargo, probablemente debería agregar algunas comprobaciones para asegurarse de que el day esté dentro del rango [0..6] .
Esta es una forma aceptable de hacer las cosas. strerror es un ejemplo de este concepto que se usa en la biblioteca C ( strerror traduce los valores de errno a descripciones de cadenas utilizables del error que ocurrió).
Sin embargo, recomendaría una de dos cosas. Deje muy claro en su documentación que el valor de retorno de esta función NO DEBE SER MODIFICADO POR EL PROGRAMADOR, o puede asignar dinámicamente una nueva cadena para que la función de llamada pueda modificarla de manera segura.