2013-07-19 14 views
6

Czy możliwe jest określenie, czy biblioteka standardowa C++ obsługuje standard C++ 11 za pomocą dyrektywy preprocesora?Czy istnieje dyrektywa preprocesora do wykrywania biblioteki standardowej C++ 11?

Obecnie pracuję nad projektem, który używa dialektu języka C++ 11, ale ze standardową biblioteką C++ bez obsługi C++ 11 (potrzebuję tego, aby móc łączyć się z nie C++ 11 biblioteki).

Jestem świadomy tego, że mogę przetestować obsługę C++ 11 przy użyciu #if __cplusplus >= 201103L, ale w moim przypadku będzie to prawda. Muszę wiedzieć o obsłudze standardowej biblioteki C++ dla C++ 11.

+1

Powiązane: http://stackoverflow.com/q/11886288/743214 –

+1

* "Jestem świadomy tego, że mogę przetestować obsługę C++ 11 za pomocą' #if __cplusplus> = 201103L' "* - Nie , nawet nie to. Biorąc pod uwagę, że większość kompilatorów obsługuje jedynie podzbiór C++ 11 (choć może to być duży podzbiór), makro '__cplusplus' jest bezużyteczne. Testowanie pod kątem standardowych funkcji (czy to języka, czy biblioteki) jest nadal nierozwiązanym problemem (chociaż * próby * rozwiązania problemu są już w toku, ponieważ * TemplateRex * wskazuje w swojej odpowiedzi). –

+1

Dla mnie twój problem brzmi, jakbyś potrzebował narzędzia konfiguracyjnego, takiego jak CMake lub autotools. Robią dla ciebie kontrole i generują nagłówek zawierający makra, które możesz ocenić. Jeśli masz tylko bibliotekę, możesz poprosić użytkowników o dostarczenie makr - nadal słabego rozwiązania. – usr1234567

Odpowiedz

3

testowania funkcji jest aktywny kierunek badawczy dla Komitetu Standardowy idąc w kierunku następnego standardu C++ 14 (a poza tym). Istnieje Grupa Badawcza 10 z własnym ogólnodostępnym mailinglist, gdzie dyskutowana jest aktualna sytuacja. Na następne spotkanie zostało przesłane: N3694 working paper.

3

Mój problem był na platformie iOS, gdzie wybór biblioteki standardowej C++ był między libstd++ (GNU C++ standard library) i libc++ (LLVM C++ standard library with C++11 support). Skończyło się na użyciu _GLIBCXX_. Kompletny kod zakończył się:

#ifndef _GLIBCXX_ 
template <class T> 
T&& move (T& arg) noexcept { 
    return static_cast<T&&>(arg); 
} 
#endif 
+1

Zakładam, że masz na myśli '__GLIBCXX__' i masz na myśli' ifdef', a nie 'ifndef'? Twój test zakłada, że ​​libstdC++ nigdy nie obsługuje C++ 11, ale to nie prawda, tylko starsza wersja dostarczana z twoim komputerem Mac nie ma wsparcia dla C++ 11. –

+0

... rok później ... Tak naprawdę skończyłem używać własnych definicji preprocesora, zamiast polegać na automatycznej inspekcji standardowej biblioteki. – Mortennobel

Powiązane problemy