C ++: время компиляции # Включить обработку, если файл не найден - PullRequest
3 голосов
/ 21 сентября 2019

В основном меня интересует случай #include <filesystem>, но также и другие экспериментальные функции, которые в конечном итоге включаются в стандарт.Проблема, как вы все знаете, заключается в том, что по мере развертывания новых функций C ++ (например, файловой системы в C ++ 17) некоторые компиляторы могут реализовывать их как экспериментальную функцию (например, GCC 7), в то время как другие могут реализовывать это какне экспериментальная особенность.Я понял, что API-интерфейсы немного изменяются при переходе от экспериментальной к финальной реализации, но ради следующего предположим, что они не ...

Есть ли способ сделать что-то вроде SFINAEвключить правильный файл.В псевдокоде это будет выглядеть примерно так:

#ifdef filesystem
  #include <filesystem>
  using std::filesystem;
#else
  #include <experimental/filesystem>
  using std::experimental::filesystem; 
#endif

Я не знаю ни одного механизма времени компиляции, который мог бы что-то сделать, если файл не найден.Что-то подобное существует?

Мне известны другие подходы для решения этой проблемы, но все они основаны на обнаружении определенного компилятора и последующем объявлении макроса, который сообщает вам, какой #include использовать.Поэтому, пожалуйста, не публикуйте ответ, который, по сути, просто собирается проверить, является ли компилятор, например, GCC 7, а затем выполнить некоторую обработку на основе этого.

1 Ответ

7 голосов
/ 21 сентября 2019

C ++ 17 представил тест препроцессора __has_include.Вы можете использовать это, чтобы проверить наличие заголовка:

#if __has_include(<filesystem>)
#  include <filesystem>
#else
//...
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...