c++ - 基于宏的 C++ 头文件选择

标签 c++ macros header-files

我目前正在编写一个 C++ 库,需要用 GCC 为 linux 和 Sun CC 为 Solaris 编译。为了提高性能,我正在创建一些类,这些类根据编译器选择不同的 header ;使用 c++0x 或 TR1 或使用 niether 和 Sun CC RogueWave 或 STLPort 的 GCC。我正在努力找出 #ifdef'ing typedef 的最佳方法,例如:

namespace project {

    #if defined(__GNUG__)
        #if defined(HAVE_CXXOX)
            #include <unorderd_map>
            typedef srd::unordered_map map;
        #elif defined(HAVE_TR1)
            #include <tr1/unordered_map>
            typedef std::tr1::unordered_map map;
        #else
            #include <map>
            typedef std::map map;
        #endif
    #elif defined(__SUNPROC_CC)
        #include <map>
        typedef std::map map;
    #endif

} //namespaces

最佳答案

这行不通有两个原因:

  1. header 必须包含在 namespace project { ... } 的范围之外。 (如果 header 只包含模板和内联函数,它可能仍然有效,但我不会指望它。)
  2. typedef 不适用于模板。有一个解决方法,您可以定义一个空的派生类。

所以也许是这样的:

#if defined(__GNUG__)
    #if defined(HAVE_CXXOX)
        #include <unordered_map>
        #define MAP std::unordered_map
    #elif defined(HAVE_TR1)
        #include <tr1/unordered_map>
        #define MAP std::tr1::unordered_map
    #else
        #include <map>
        #define MAP std::map
    #endif
#elif defined(__SUNPROC_CC)
    #include <map>
    #define MAP std::map
#endif

namespace myproject {
    template <class K, class V>
    class map : public MAP<K, V> {};
}

#undef MAP

关于c++ - 基于宏的 C++ 头文件选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510109/

相关文章:

c++ - 具有 int 类型的枚举类的 printf 不适用于 clang

c++ - 在两个函数中使用相同的变量

c++ - MinGW/G++/g95 链接错误 - libf95 未定义对 `MAIN_' 的引用

c - 选择合适的错误报告机制 : How can I change a macro at compile time?

string - Clojure 从字符串中获取表单

php - JavaScript 或 PHP 中的宏?

c++ - 如果我只有依赖程序的 .o 文件,我可以在可执行文件中反射(reflect)头文件的变化吗

c++ - 在 Ubuntu 中包含 OpenCv 头文件

c++ - 双击 ListView (c++,不是 .net!)

c++ - 在 C++ 中使用关键字 class 作为变量名