2015-07-19 5 views
6

Ich versuche, die Version libstdc++ zu testen, weil std::regex is implemented, but largely broken, in den Versionen von libstdc++ mit GCC vor Version 4.9.0 verteilt.Wie kann ich die Version von libstdC++, nicht GCC, zur Kompilierzeit testen?

Beachten Sie, dass:

Gibt es eine portable Möglichkeit, die Version von libstdc++ zu testen, die nicht zur Verwendung von GCC meinen Compiler abhängt?

+0

Wenn Sie wissen, dass es bei einer bestimmten Version kaputt ist, dann ist es testet seine gebrochen, um zu sehen, ob, wenn ja, dann haben Sie die gebrochene Version haben, wenn nicht, dann haben Sie die Arbeitsversion. – ydobonebi

+1

In der Praxis besteht der beste Weg, eine Version zu ermitteln, in der keine Version angegeben ist, darin, gegen bekannte Verhaltensweisen zu testen. Ich wollte das nur klären. Abgesehen davon, mit welchem ​​OS arbeiten Sie? Ich überprüfe Fenster, wenn ich meine Ersonnummern bestimmen kann oder nicht ... – ydobonebi

+1

Quinn Roundy: Ich würde es vorziehen, die Version tatsächlich zu testen. Der Fehler tritt nur zur Laufzeit auf, daher müsste ich ein Testprogramm als Teil meines Build-Prozesses kompilieren (und ausführen). Dies könnte möglicherweise beim Cross-Compilieren brechen. –

Antwort

-2

Meiner Meinung nach ist das Problem ausreichend klein, um mit roher Gewalt gelöst zu werden.

In einer Header-Datei namens machine.hpp oder ähnliches würde ich testen, dass die Version des C++ Standards ist zumindest was ich brauche es zu sein (die __cplusplus Makro). Dann würde ich die verschiedenen Makro-Checks hinzufügen, um jede Bibliothek abzulehnen, von der ich weiß, dass sie fehlerhaft ist.

Mit anderen Worten, ich würde eine schwarze Liste Ansatz anstelle eines weiß-Liste Ansatz.

Zum Beispiel:

#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

Ich versuche herauszufinden, wie man "die verschiedenen Makroüberprüfungen hinzufügt, um irgendeine Bibliothek zurückzuweisen dass ich weiß, dass es fehlerhaft ist. " Ich kann nicht herausfinden, wie man die Version von 'libstdC++' beim Erstellen mit einem Nicht-GCC-Compiler (z.B. Clang) zuverlässig überprüft. –

+0

Danke für die Erweiterung Ihrer Antwort. Dies ist jedoch keine sehr wartungsfreundliche Lösung. '__GLIBCXX__' steigt nicht monoton an, daher müsste ich diesen Header jedes Mal bearbeiten, wenn eine neue Version von GCC> 4.9 veröffentlicht wird. –

+0

@ MichaelKoval das ist nicht der Fall. Genau deshalb markieren Sie nur die Compiler, die Sie NICHT verwenden möchten. Wenn eine neue Version von GCC herauskommt, verwenden Sie sie einfach ohne irgendeine Änderung an der Überschrift. – Escualo

Verwandte Themen