2015-10-31 5 views
6

Zunächst einmal habe ich diese Frage lesen: Is there a way to detect portably that a standard header is included using macros?Kann ich sicher #ifdef verwenden, um zu wissen, ob ein C++ std-Header enthalten ist?

Und was will ich weiß, ist: Wie sicher ist es #ifdef für die Aufgabe der Erkennung zu verwenden, wenn ein C++ std-Header enthalten ist, wie in dem Code unten:

namespace overwrite 
{ 
    using byte = unsigned char; 

    template <bool safeMode = true, typename generic> 
    void withZeros(generic *toBeOverwriten, size_t length = 1) 
    { 
     // do stuff 
    } 

    #ifdef _GLIBCXX_RANDOM // found this macro inside <random> 
    template <bool safeMode = true, typename generic> 
    void withRandomData(generic *toBeOverwriten, byte min = 0, byte max = 255) 
    { 
     // do stuff expecting <random> to be included 
    } 
    #endif 
} 

... so dass ich nicht nur könnte eine std Funktion als „schlechtes Match“ überlaste, wie in der Antwort auf die genannte Frage vorgeschlagen, sondern auch kompilieren oder nicht eine ganze Funktion/section of My Kopf Datei, abhängig von der Aufnahme einiger Std-Header.

Ist dieser Weg überhaupt nicht sicher, wie ich vermute? Wenn ja, gibt es andere Möglichkeiten, dies zu erkennen, um das zu tun, was ich will?

In Bezug auf „Warum zum Teufel ich den Header einfach nicht schließen“ ...

Der Code, den ich als ein Beispiel für das, was ich versuche, ist nur ein Beispiel zu tun. Ich hatte noch andere Dinge in meinem Kopf und wollte nur wissen, ob es eine andere Möglichkeit gibt, nach Header zu suchen, ohne Makros zu checken, von denen man erwartet, dass sie in diesen definiert werden. Dann erinnerte ich mich an diese reale Situation, in der ich mich selbst danach fragte, und ich begann mit der Frage, was ich verlange ... da ich in diesem Fall nicht viel Code einfügen möchte (<random> ist länger als 20) oder 30 LOC) nur um eine einzelne Funktion meines Headers zu "erhal- ten".

+1

schließen Sie einfach den Header? – Dani

+0

SFINAE ........? –

+0

BTW, warum nicht einfach #include random? –

Antwort

3

Es gibt einen Vorschlag für c++17, den __has_include Makro hinzuzufügen.

Die neueste Version ist nicht öffentlich noch nicht, aber diskutiert wurde bei der letzten Sitzung Standard (zugelassen?): https://www.reddit.com/r/cpp/comments/3q4agc/c17_progress_update_oct_2015/

Die vorherige Version: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061r0.html


Bis dahin denke ich nicht Es gibt einen portablen Weg zu erkennen, ob ein Header verfügbar ist. Das Beste, was Sie tun können, ist zu überprüfen, welches Makro eine Kopfzeile definiert, wobei zu berücksichtigen ist, dass verschiedene Bibliotheken unterschiedliche Makros haben und dass der Name sogar in denselben Bibliotheken von Revision zu Revision wechseln kann, da es ein internes Makro ist. Es ist nicht so schlimm, wenn Sie nur die wichtigsten Compiler unterstützen möchten (es gibt 3) und nicht erwarten, dass Ihr Code in 3-5 Jahren unterstützt wird.

Anstatt nach einer Kopfzeile zu suchen, sollten Sie nach Funktionen suchen. C++11 definiert weiter eine Reihe von feature testing macros:

http://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros

+0

Sehr interessante Links, speziell diese einen über Feature-Tests ... Aber '__has_include' sieht irgendwie weit weg von jetzt :( –

Verwandte Themen