Aggiungo controlli in fase di compilazione ai progetti C++ della mia azienda per assicurarmi che le librerie di terze parti su tutte le macchine di sviluppo e sui server di compilazione siano aggiornate. La maggior parte delle librerie definisce qualcosa come il seguente per es. Versione 3.1.4:Come verificare un valore come "#define VERSION 3.1.4" al momento della compilazione?
#define VERSION_MAJOR 3
#define VERSION_MINOR 1
#define VERSION_BUILD 4
Questo è bello e facile da controllare usando static_assert
o preprocessore direttive.
ora sto guardando una libreria di terze parti che definisce un unico macro invece:
#define VERSION 3.1.4
Come posso verificare il valore di una macro al momento della compilazione?
Con C++ 11, ho potuto utilizzare una funzione di confronto constexpr
stringa e stringa i la macro di check it:
constexpr bool static_equal(const char * a, const char * b)
{
return (*a == *b) && (*a == '\0' || static_equal(a + 1, b + 1));
}
// stringification functions
#define str(x) #x
#define xstr(x) str(x)
static_assert(static_equal(xstr(VERSION), "3.1.4"), "incorrect version of libwhatever");
Ma stiamo utilizzando Visual Studio 2013 sulle macchine Windows, quindi posso usare solo il sottoinsieme di C++ 11 che supporta. Sfortunatamente constexpr
non è supportato.
Potrebbe essere più semplice conservare un altro file in cui la versione è suddivisa come preferisci. –
Nel preprocessore non puoi aver paura. I confronti funzionano solo sugli interi e non c'è modo di dividere il token 3.1.4. Dovrà essere un passaggio di elaborazione del testo esterno di qualche tipo, o controllare in fase di esecuzione. VS2015 rc è disponibile e potrebbe supportare constexpr. –
@RSahu: questa è una libreria di terze parti. Se volessi aggiungervi dei file, dovrei creare pacchetti personalizzati e costringere gli sviluppatori a usarli. Questo è molto più noioso del download dalle fonti originali, oppure, per Debian e derivati, 'apt-get libwhatever-dev'. – gnome