2015-10-31 1 views
6

Прежде всего, я прочитал этот вопрос: Is there a way to detect portably that a standard header is included using macros?Могу ли я безопасно использовать #ifdef, чтобы узнать, включен ли заголовок std C++?

И то, что я хочу знать: Насколько безопасно использовать #ifdef для задачи обнаружения, если C++ станд заголовок включен, как в коде ниже:

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 
} 

... так что я не мог просто перегружать некоторую зУю функцию, как «хуже матч», как предложено в ответ на указанный вопрос, но и компилировать или не целую функцию/раздел Моего заголовка файл, в зависимости от включения какого-либо std-заголовка.

Этот способ небезопасен, как я подозреваю? Если да, есть ли другие способы обнаружить это, чтобы делать то, что я хочу?

Касательно «Почему, черт возьми, я просто не включают заголовок» ...

Код Даю в качестве примера того, что я пытаюсь сделать, это просто пример. У меня были и другие вещи в моем уме, и я просто хотел знать, есть ли другой способ проверить включение заголовков без проверки макросов, которые вы ожидаете определить внутри них. Затем я вспомнил об этой реальной ситуации, когда я спросил себя об этом, и я начал с того, что спросил, о чем я прошу ... поскольку в данном случае я не хочу включать много кода (<random> длиннее 20 или 30 LOC), чтобы «выдержать» одну функцию моего заголовка.

+1

Просто включить заголовок? – Dani

+0

SFINAE ........? –

+0

Кстати, почему бы вам просто не включить # случай? –

ответ

3

Чтобы добавить макрос __has_include, для c++17 существует предложение.

последняя версия не является публичной еще, но обсуждался на последнем заседании стандартной (утвержден?): https://www.reddit.com/r/cpp/comments/3q4agc/c17_progress_update_oct_2015/

Предыдущая версия: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061r0.html


До тех пор я не думаю, существует портативный способ обнаружения, если заголовок доступен. Лучшее, что вы можете сделать, это проверить, какой макрос определяет заголовок, учитывая, что разные библиотеки имеют разные макросы и что даже в тех же библиотеках имя может изменяться с ревизии на ревизию, поскольку это внутренний макрос. Это не так уж плохо, если вы хотите поддерживать основные компиляторы (их 3), и не ожидайте, что ваш код будет поддерживаться через 3-5 лет.

Вместо проверки заголовка, если это возможно, вы должны проверить наличие функций. C++11 далее определяет набор feature testing macros:

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

+0

Очень интересные ссылки, особенно это об анализе функций ... Но '__has_include' выглядит довольно далеко отсюда :( –

 Смежные вопросы

  • Нет связанных вопросов^_^