0
votes

C ++ __Time__ est différent quand appelé à partir de différents fichiers

J'ai rencontré cette chose étrange tout en jouant avec des macros prédéfinies. Donc, fondamentalement, lorsque vous appelez __ temps __ de différents fichiers, cela se produit:
__ time__ bug

Y a-t-il de toute façon je peux résoudre ce problème? Ou pourquoi cela arrive-t-il?
Tout ce que je fais est printf ("% s \ n", __time __); de différentes fonctions de différentes sources.


17 commentaires

__ Time __ se développe à une chaîne donnant le temps auquel le fichier source actuel a été compilé (ou pré-expressé). C'est donc le comportement attendu car vos fichiers source ont été compilés de 1 seconde à part. Qu'est-ce que vous espérez vraiment accomplir?


@Nateeldredge je voulais utiliser temps comme une graine aléatoire. Je faisais cela '#define Shift_Key (__Time __ [0] -' 0 '+ __T0 __ [1] -' 0 '+ __T0 __ [3] -' 0 '+ __ Time __ [4] -' 0 '+ __ 6] - '0' + __ Time __ [7] - '0') 'et avait besoin __ Time être identique dans toutes mes sources. Y a-t-il de toute façon je peux activer cela?


Veuillez joindre le code dans les marques de backticks (`) afin qu'il sort correctement formaté correctement.


Donc, juste pour vous assurer que vous souhaitez utiliser Compilation en tant que graine aléatoire? Cela signifie que le code résultant produira les mêmes nombres aléatoires chaque fois qu'il est exécuté jusqu'à ce que vous recompiliez.


@Nateeldredge exactement


@NateEldredge est là quand même à coller avec la __ __ macro? J'ai besoin d'utiliser une macro pour la graine


Note latérale: __ est un caractère spécial dans le marquage, et il est interprété comme Texte audacieux Vous voudrez peut-être mettre vos extraits dans des backtstics (``) pour éviter cela.


@Catacata: Pourquoi doit-il être une macro? Il serait plus simple d'utiliser __ __ pour initialiser une variable globale dans un seul fichier et utiliser cette variable partout.


@Nateeldredge J'essaie d'accomplir le cryptage de la chaîne de l'horaire de compilation à l'aide de macros et le seul moyen de le faire, consiste à utiliser des macros.


@Catacata: D'accord, bonne chance alors. Trop bizarre pour moi.


GCC ... -DSeed = $ (date +% s) ... et utilisez graine au lieu de __ temps __


@PMG Pourriez-vous me relier plus d'informations sur la date et les différents formats / variables que je peux utiliser? Cela pourrait être idéal pour ce que je fais.


Je ne savais pas +% s par cœur. Je viens de taper Date d'homme pour voir les options. Vous pouvez voir le POSIX DATE page en ligne


@PMG Je ne peux pas sembler avoir la date d'affichage des secondes uniquement, BTW im en utilisant VS2017. C'est le format que j'ai essayé -DSeed = $ (date +% s). L'a ajouté aux options Commandline / Aditionnelles.


On dirait que POSIX n'a ​​pas la +% s ou équivalent. Vous voudrez peut-être utiliser +% y-% m.% d% h:% m:% s ou +% y% m% d% h% m% s .


@pmg je l'ai défini comme -DSeed = $ (date +% y% m% d% h% m% s) mais lorsque vous essayez de l'imprimer printf ("% s: \ n ", Graine); i get 'expression attendue' erreur.


Peut-être que vs2017 ne fait pas Substitutions de commande comme Posix Shells ?


3 Réponses :


3
votes

ou pourquoi cela se produit-il?

de la DOCS:

Cette macro se développe à une constante de chaîne décrivant le temps auquel le pré-dépresseur est exécuté .

Si les fichiers source sont compilés à des moments différents, le temps sera différent.

Y a-t-il de toute façon je peux résoudre ce problème?

Vous pouvez utiliser un outil de ligne de commande pour générer la chaîne de temps et transmettre la chaîne sous forme de définition de macro au compilateur. De cette façon, le temps sera le même pour tous les fichiers compilés par cette commande.


7 commentaires

Merci, réponse très utile


Y a-t-il un moyen de stocker le __ __ d'un fichier spécifique comme macro?


@Catacata Bien sûr, mais cela ne vous sera pas utile, car vous ne pouvez utiliser que la macro dans la même unité de traduction où vous le définissez.


@erorika Cela pourrait être utile .. Comment pourrais-je accomplir ça?


@Catacata définit simplement une macro: #define id même_time __time __ . Maintenant, vous pouvez utiliser même_time macro dans cette même unité de traduction, et il produira le même résultat que __ fois __ .


@erorika Cela ne semble pas affecter ma question en quelque sorte


@Catacata #define id même_time __Time __ n'est pas censé résoudre votre problème. C'est une définition inutile (donc «qui ne vous sera pas utile») car ce n'est que bon dans la même unité de traduction (c'est-à-dire le fichier source) et est donc totalement équivalent à l'utilisation de __ dans le premier lieu.



0
votes

Eh bien, je pense que votre cas d'utilisation est un peu étrange, mais un moyen simple d'obtenir la même heure dans tous les fichiers est d'utiliser __ __ code> dans exactement un fichier source et utilisez-le pour initialiser un Variable globale:

compilation_time.h: p> xxx pré>

compilation_time.c: p> xxx pré>

plus_code.c: P>

#include "compilation_time.h"
...
    srand(seed);


0 commentaires

1
votes

Pour répondre à votre question initiale: __ Time __ sera différent pour différents fichiers, car il spécifie le temps où ce fichier spécifique a été compilé.

Cependant, vous demandez à Problème X-Y . Pour répondre à ce que vous essayez réellement de faire:

Si vous avez besoin d'une valeur de temps de compilation, vous ferez mieux de laisser votre système construire le spécifie. C'est-à-dire, avec faire ou quoi que vous utilisiez, générez une graine aléatoire en quelque sorte, puis transmettez-le sur le compilateur en tant qu'option de ligne de commande pour définir votre posséder la macro préprocesseur (par exemple, gcc -dmy_seed = $ (aléatoire_value) ... ). Ensuite, vous pouvez appliquer cela à tous les fichiers c que vous compilez et que chacun d'entre eux utilise my_seed Toutefois souhaité.


1 commentaires

C'est fondamentalement la même chose que la réponse d'Eerorika.