2015-10-31 13 views
6

Prima di tutto, ho letto questa domanda: Is there a way to detect portably that a standard header is included using macros?Posso tranquillamente usare #ifdef per sapere se è inclusa un'intestazione std C++?

E quello che voglio sapere è: Quanto è sicuro da usare #ifdef per il compito di rilevare se un colpo di testa C++ std è incluso, come nel codice qui di seguito:

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 
} 

... in modo che ho potuto non solo sovraccaricare qualche funzione std come "match di peggio", come proposto nella risposta alla domanda citata, ma anche la compilazione o meno di una intera funzione/sezione del mio header file, a seconda dell'inclusione di alcune intestazioni std.

In questo modo non è affatto sicuro, come sospetto? Se è così, ci sono altri modi per rilevarlo per fare ciò che voglio?

Riguardo a "Perché diavolo non ho solo include l'intestazione" ...

Il codice do come un esempio di quello che sto cercando di fare è solo un esempio. Avevo anche altre cose nella mia mente e volevo solo sapere se c'era un altro modo per verificare l'inclusione delle intestazioni senza controllare i macro che ci si aspetta siano definiti all'interno di essi. Poi mi sono ricordato di questa situazione reale in cui mi sono interrogato su questo e ho iniziato chiedendo cosa sto chiedendo ... visto che, in questo caso, non voglio includere molto codice (<random> è più lungo di 20 o 30 LOC) solo per "sostenere" una singola funzione della mia intestazione.

+1

Basta includere l'intestazione? – Dani

+0

SFINAE ........? –

+0

BTW, perché non includi semplicemente #include? –

risposta

3

C'è una proposta per c++17 per aggiungere la macro __has_include.

L'ultima versione non è pubblico ancora, ma è stato discusso durante l'ultima riunione standard (approvati?): https://www.reddit.com/r/cpp/comments/3q4agc/c17_progress_update_oct_2015/

La versione precedente: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061r0.html


Fino ad allora non credo c'è un modo portatile di rilevare se è disponibile un'intestazione. Il meglio che puoi fare è verificare quale macro definisce un'intestazione, tenendo presente che le diverse librerie hanno macro diverse e che anche nelle stesse librerie il nome può cambiare da revisione a revisione, in quanto è una macro interna. Non è così male se vuoi solo supportare i principali compilatori (ce ne sono 3) e non aspettarti che il tuo codice venga supportato tra 3-5 anni.

Invece di cercare un'intestazione, se possibile è necessario verificare le funzionalità. C++11 definisce poi una serie di feature testing macros:

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

+0

Link molto interessanti, specialmente questo sui test delle funzionalità ... Ma '__has_include' sembra un po 'lontano da adesso :( –

Problemi correlati