【问题标题】:Determine compile-time existence of include files in C++确定 C++ 中包含文件的编译时存在
【发布时间】:2010-11-13 23:25:36
【问题描述】:

我正在尝试编写一些可移植的 C++ 库代码,这些代码最初将依赖于 Boost.Regex,然后在编译器支持时移至 TR1,并在事情从 std 移出后最终移至 C++0x 规范: :tr1 命名空间到标准。这是我想用预处理器做的一些伪代码:

if( exists(regex) )    // check if I can #include <regex>
{
    #include <regex>    // per TR1
    if( is_namespace(std::tr1) )   // are we on TR1 or C++0x?
    {
        using std::tr1::regex;
    } else
    {
        using std::regex;
    }
} else    // fall-back to boost
{
    #include <boost/regex.hpp>
    using boost::regex;
}

当然,所有这些都需要在预处理器指令中,但如果我知道如何完成,我就不会在这里问了。 :)

【问题讨论】:

    标签: c++ c++11 boost c-preprocessor tr1


    【解决方案1】:

    如果不依赖第三方的东西预处理,你就无法做到这一点。通常,可以使用 autoconf 之类的东西来完成此操作。

    它们的工作原理是使用 #define 指令生成另一个头文件,指示您要使用的头文件/库的存在。

    【讨论】:

    • 感谢您的澄清! :)
    【解决方案2】:

    你做不到。 C++ 的预处理阶段发生在编译阶段之前,因此 C++ 语言条件构造不能有效地放置在 #include 等预处理器指令周围。

    如果你需要条件编译,那么方法就是使用#ifdef。比如:

    #ifdef BOOST_BUILD
      #include "somebooststuff.h"
      using namespace boost;
    #else
      #include "somestdstuff.h"
      using namespace std;
    #endif
    

    其中 BOOST_BUILD 是您在 makefile 或其他任何内容中定义的预处理器符号。

    【讨论】:

    • 我特别说过我没有尝试使用 C++ 编译的条件结构。更具体地说,我正在寻找类似于 #ifdef 指令的东西,它具有检查包含文件是否存在的功能:#ifexists (或类似的东西)
    • 没有这样的预处理器功能。如果你真的需要这样做 9 我怀疑你这样做)你需要在编译之前通过某种用 perl 或 python 编写的文本处理脚本来运行你的代码。
    【解决方案3】:

    您可以使用 __cplusplus 宏来查看您正在使用的 C++ 版本,在下一个标准(C++1x、C++0x isn't meant to be)中,它将具有 a value larger than 199711L

    #if __cplusplus > 199711
        using std::regex;
    #else
        using std::tr1::regex;
    #endif
    

    【讨论】:

      【解决方案4】:

      如果您最近遇到此问题,请更新此主题: 现在这在 C++17 中是可能的,使用预处理宏 __has_include()

      #if __has_include("MyInclude")
      #  include "MyInclude"
      #  define MY_INCLUDE 1
      #else
      #  define MY_INCLUDE 0
      #endif
      

      这里有详细信息:

      https://en.cppreference.com/w/cpp/preprocessor/include

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2021-11-14
        • 1970-01-01
        • 2015-11-22
        相关资源
        最近更新 更多