C++:如果未找到文件,则进行编译时 #Include 处理

C++: compile-time #Include handling if file not found

本文关键字:编译 处理 #Include 如果 文件 C++      更新时间:2023-10-16

主要是我对#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,然后基于此进行一些处理。

C++17 引入了__has_include预处理器测试。您可以使用它来检查标头是否存在:

#if __has_include(<filesystem>)
#  include <filesystem>
#else
//...
#endif