web-dev-qa-db-fra.com

Pourquoi Clang n'aime-t-il pas la macro __DATE__?

Je utilise le __DATE__ macro pour obtenir une année de compilation:

const QString build_year = __DATE__ + 7;

Le modèle de code Clang dans QtCreator lance un -Wdate-time avertissement pour l'utilisation de __DATE__ macro.

warning: expansion of date or time macro is not reproducible

Je peux désactiver cet avertissement avec -Wno-date-time, mais qu'est-ce qui ne va pas avec __DATE__?

Qu'est-ce qu'une "expansion" de la macro, comment peut-elle être "reproductible" ou "non reproductible", et pourquoi "non reproductible" est-elle mauvaise?

19
yalov

Avoir des builds répétés reproduisant des sorties binaires identiques est souhaitable à plusieurs points de vue. Construire du code source identique à partir de chaînes d'outils identiques en donnant à chaque fois des binaires différents pourrait cacher de sérieux problèmes.

Si vous n'avez pas besoin de produire des fichiers binaires identiques à chaque fois que vous créez un code identique, désactivez simplement cet avertissement. c'est pourquoi le commutateur de ligne de commande existe.

41
Stephen M. Webb

Le message d'avertissement vous explique pourquoi. L'utilisation de la macro n'entraîne pas de génération reproductible car sa valeur changera avec le temps. Une build en 2018 et une en 2019 ne produiront pas le même binaire.

4
Jesper Juhl