2015-07-19 4 views
6

Sto provando a verificare la versione di libstdc++ perché std::regex is implemented, but largely broken, nelle versioni di libstdc++ distribuito con GCC prima della versione 4.9.0.Come posso testare la versione di libstdC++, non GCC, in fase di compilazione?

Nota che:

Esiste un modo portatile per testare la versione di libstdc++ che non dipende sull'uso GCC mia compilatore?

+0

Se si sa che è rotto in una certa versione, quindi provare a vedere se la sua rotta, se lo è, allora si ha la versione rotto, se non, allora avete la versione funzionante. – ydobonebi

+1

In pratica, il modo migliore per determinare una versione in cui non viene fornita alcuna versione è testare comportamenti noti. Volevo solo chiarirlo. A parte questo, con che sistema operativo stai lavorando? Sto controllando su Windows se posso determinare i miei numeri di ersione o no ... – ydobonebi

+1

Quinn Roundy: Preferirei testare effettivamente la versione. Il bug si verifica solo in fase di esecuzione, quindi dovrei compilare (ed eseguire) un programma di test come parte del mio processo di compilazione. Questo potrebbe, potenzialmente, rompersi durante la compilazione incrociata. –

risposta

-2

A mio parere il problema è sufficientemente piccolo da essere risolto con la forza bruta.

In un file di intestazione chiamato machine.hpp o simile, testerei che la versione dello standard C++ sia almeno quello che mi serve (la macro __cplusplus). Quindi aggiungerei i vari controlli macro per rifiutare qualsiasi libreria che so essere difettosa.

In altre parole, vorrei adottare un approccio lista nera invece di un white-list approccio.

Ad esempio:

#pragma once 
#ifndef MACHINE_HPP_HEADER_GUARDS 
#define MACHINE_HPP_HEADER_GUARDS 

#if __cplusplus < 201103L 
// Library is incompatible if it does not implement at least the C++11 
// standard. 
#error "I need a library that supports at least C++11." 
#else 
// Load an arbitrary header to ensure that the pre-processor macro is 
// defined. Otherwise you will need to load this header AFTER you 
// #include the header you care about. 
#include <iosfwd> 
#endif 

#if __GLIBCXX__ == 20150422 
#error "This version of GLIBCXX (20150422) has flaws in it" 
#endif 

// ...repeat for other versions of GLIBCXX that you know to be flawed 

#endif // MACHINE_HPP_HEADER_GUARDS 
+0

Sto cercando di capire come "aggiungere i vari controlli macro per rifiutare qualsiasi libreria che so essere difettoso. " Non riesco a capire come controllare in modo affidabile la versione di 'libstdC++' quando si costruisce con un compilatore non GCC (ad esempio Clang). –

+0

Grazie per aver ampliato la tua risposta. Tuttavia, questa non è una soluzione molto manutenibile. '__GLIBCXX__' non aumenta in modo monotono, quindi dovrei modificare questa intestazione ogni volta che viene rilasciata una nuova versione di GCC> 4.9. –

+0

@MichaelKoval che non è il caso. Proprio per questo motivo contrassegni solo i compilatori che NON vuoi utilizzare. Quando esce una nuova versione di GCC, la usi semplicemente senza alcuna modifica all'intestazione. – Escualo