time_t funcion current and c time posix

funcion - time c



¿Por qué `gmtime` toma un puntero? (2)

La razón probablemente sea que en los viejos tiempos un parámetro no podía ser más grande que un entero, por lo que no podía pasar mucho y tenía que hacer eso como un puntero. La definición de la función nunca cambió.

De acuerdo con la documentación, la struct tm *gmtime(const time_t *timer); se supone que convierte el time_t apuntado por el timer a un tiempo descompuesto.

¿Ahora hay una razón por la que decidieron hacer que la función tome un puntero al time_t lugar de pasar el time_t directamente?

Por lo que puedo ver time_t es de tipo aritmético y, por lo tanto, debería haber sido posible pasar directamente (también me parece razonable que hubiera cabido en un long ). También parece que hay un manejo específico del puntero NULL (que podría haber motivado pasar un puntero).

¿Se me escapa algo? Algo todavía relevante hoy?


Por lo que he visto, es más una peculiaridad histórica. Cuando time.h se introdujo por primera vez, y funciona como time , usó un valor que no se pudo devolver (es decir: no long int etc.). El estándar definió un tipo time_t oscuro que todavía deja mucho espacio para que los vendedores implementen de maneras extrañas (tiene que ser un tipo aritmético, pero no se definen rangos o valores máximos, por ejemplo) - Estándar C11:

7.27.1 Componentes del tiempo.
[...]
3. Los tipos declarados son size_t (descrito en 7.19);
clock_t
y
time_t
que son tipos reales capaces de representar tiempos;
4. El rango y la precisión de los tiempos representables en clock_t y time_t están definidos por la implementación.

size_t se describe, en C11, como "es el tipo entero sin signo del resultado del operador sizeof";

A la luz de esto, su comentario ( "Me parece razonable que hubiera cabido en un long " ) es comprensible, pero es incorrecto o, al menos, inexacto. POSIX, por ejemplo, requiere que time_t sea ​​un entero o tipo flotante real. Un long ajusta a esa descripción, pero también lo haría un long double que no cabe en long . Una suposición más precisa que hacer sería que el tamaño mínimo de time_t es un int de 32 bits (hasta 2038 al menos), pero ese time_t preferiblemente es un tipo de 64 bits.

De todos modos, en aquellos días, si no se podía devolver un valor, la única alternativa era pasar la memoria a la función (lo cual es algo sensato que hacer).
Es por eso que tenemos funciones como

time_t time(time_t *t);

Realmente no tiene sentido establecer el mismo valor dos veces: una vez al devolverlo, y una vez con indirección, pero el argumento está allí porque originalmente, la función se definió como

time(time_t *t)

Tenga en cuenta la falta de un tipo de devolución, si el time se añadiera hoy, o bien se definiría como void time( time_t * ) , o si el comité no había estado bebiendo, y se dio cuenta de lo absurdo de pasar un puntero aquí, '' d time_t time ( void ); como time_t time ( void );

Mirando el estándar C11 con respecto a la función de tiempo, parece que el énfasis del comportamiento de las funciones está en el valor de retorno. El argumento del puntero se menciona brevemente, pero ciertamente no se le da ningún significado:

7.27.2.4 La función de tiempo

1. Sinopsis

#include <time.h>
time_t time(time_t *timer);

2. Descripción

La función de tiempo determina el tiempo de calendario actual. La codificación del valor no está especificada.

3. Devoluciones

La función de tiempo devuelve la mejor aproximación de la implementación al tiempo calendario actual. El valor ( time_t ) (- 1) se devuelve si el tiempo del calendario no está disponible. Si el temporizador no es un puntero nulo, el valor de retorno también se asigna al objeto al que apunta.

Lo principal que podemos sacar de esto es que, en lo que respecta al estándar, el puntero es solo una forma secundaria de obtener el valor de retorno de la función. Dado que el valor de retorno indica que algo salió mal ( (time_t)(-1) ), argumentaría que deberíamos tratar esta función como si fuera el time_t time( void ) .

Pero debido a que la implementación anterior todavía está dando vueltas, y todos nos hemos acostumbrado, es una de esas cosas que deberían haberse marcado como desaprobación, pero como nunca fue así, probablemente formará parte del lenguaje C Siempre...

El único otro motivo por el que las funciones usan time_t como este ( const ) es histórico o para mantener una API consistente en la API time.h AFAIK eso es

TL; DR

La mayoría de time.h funciones time.h usan punteros al tipo time_t por razones históricas, de compatibilidad y de coherencia.

Sabía que leí esas cosas sobre los primeros días de la función de time antes, aquí hay una respuesta SO relacionada