2015-09-09 2 views
3

Je suppose que ce n'est pas possible (encore) mais pas sûr. J'ai besoin de faire une compilation conditionnelle basée sur la date actuelle. Quelque chose comme:Préprocesseur C/C++ #if avec datetime

#if (__CURRENT_YEAR < 2016) 
... 
#endif 

je dois exclure quelque chose de projet au bout de quelques mois et être sûr que ce ne sera pas oubliée (dans les versions ultérieures).

+3

Vous voudrez peut-être jeter un oeil à ce SO poste: http://stackoverflow.com/a/16472369/949297 –

+8

Je voudrais corriger cela dans le système de construction, laissez-le déterminer la date (en utilisant une fonction shell appropriée), et générer une définition injectée via l'option '-D'. –

+0

Je suis d'accord. Mais c'est une solution relativement complexe et indirecte. Ma question était de vérifier si j'avais omis quelque chose des fonctions du préprocesseur d'aujourd'hui. – i486

Répondre

0

Un tel comportement n'est pas possible avec le préprocesseur C, mais il pourrait être résolu à un niveau supérieur via votre système de construction. Vous pouvez construire des scripts qui générer automatiquement un en-tête au moment de la construction qui contient quelque chose comme:

#define __CURRENT_YEAR 2015 

Cet en-tête serait alors inclus par votre code qui est sensible à ce jour. Selon l'implémentation de votre système de construction, vous pouvez le faire automatiquement à chaque construction ou si un changement d'année est détecté.

+2

Oui c'est .... '__DATE__'. –

+1

@BrianMcFarland: Mais '__DATE__' est une constante de chaîne, non utilisable dans les expressions de préprocesseur, donc je ne sais pas comment cela pourrait résoudre le problème de l'OP. C'est possible que je ne voie pas quelque chose, cependant. –

+0

Ok, mais comment obtenir l'année ou le mois de '__DATE__'? '__DATE__' est utile pour mettre la date actuelle en compilation. – i486

5

Dans votre Makefile ajouter

CFLAGS += -DYEAR=$(shell date +%g) 

Ensuite, dans votre source C:

#if (YEAR < 16) 
.... 
#endif 
+0

Je pense que vous voulez ['+% Y'] (http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/) au lieu de' +% g'. – MooseBoys

+0

@MooseBoys Avez-vous vérifié '+% g' en premier? – qrdl

+0

FWIW, dans CMakeLists.txt qui serait 'chaîne (TIMESTAMP YEAR"% Y ")' et 'add_definitions (-DYEAR = $ {YEAR})' pour le même effet (année à quatre chiffres, cependant). ;-) – DevSolar