façon portable pour traiter 64/32 bit time_t
J'ai un code qui est construit à la fois sur Windows et Linux. Linux à ce point est toujours en 32 bits, mais Windows est en 32 et 64 bits. Windows veut avoir time_t 64 bits et Linux, toujours en 32 bits. Je suis très bien avec ça, sauf dans certains endroits time_t les valeurs sont converties en chaînes de caractères. Alors, quand time_T est de 32 bits, il devrait être fait avec %d, et quand il est en 64 bits avec %lld... ce qui est la façon intelligente de le faire? Aussi: des idées comment je peut trouver tous les endroits où time_t sont passé à printf fonctions de style pour répondre à cette question?
edit:
Je suis venu avec déclarer TT_FMT "%d" ou "%lld" et ensuite de changer mon printfs comme dans
printf("temps: %d, inscrivez-vous: blah") printf("le temps:" TT_FMT ", inscrivez-vous: blablabla")
Est-il un meilleur moyen? Et comment puis-je les trouver tous?
source d'informationauteur MK.
Vous devez vous connecter pour publier un commentaire.
Selon la norme C
time_t
est un type arithmétique, "capable de représenter les temps". Aussi, il pourrait êtredouble
par exemple. (Posix le mentionne plus explicitementet garantit également quetime()
retourne le nombre de secondes depuis l'Epoch—ci n'est pas garanti par la norme C.)Peut-être la solution la plus propre est de convertir la valeur quel que soit le type que vous voulez. Vous souhaitez peut-être l'un des
unsigned long long
ouunsigned long
:Je pense que la seule véritablement portable est d'utiliser
strftime
pour convertir letime_t
à une chaîne.Si vous êtes sûr que vous êtes d'exploitation uniquement sur les plates-formes où
time_t
est unint
vous pourriez lancer àintmax_t
(à partir destdint.h
) et de l'imprimer à l'aide dePRIdMAX
(à partir deinttypes.h
).Si vous voulez aller avec la macro rédacteur de devis, je vous recommande une petite astuce. Au lieu de l'encapsulation de l'ensemble du prescripteur, encapsuler juste le modificateur:
et ensuite de l'utiliser comme ceci:
La raison en est que si vous voulez la deuxième décimale, tout aussi souvent que vous pouvez hex (ou peut-être vous voulez le 0 initial). En ayant seulement le modificateur de là, vous pouvez facilement écrire: