如何在编译时检测类的声明?

时间:2015-07-01 23:17:59

标签: c++ c-preprocessor

我在我的项目中使用了一些第三方库。更新到库的新版本后,我遇到了错误。

我班上有一个方法

virtual RTSPServer::RTSPClientSession* createNewClientSession(u_int32_t sessionId)override;

但是在RTSPClientSession的新版本的库声明中被移动到另一个类并重命名。现在正确的名称是

GenericMediaServer::ClientSession

我需要一个能够正确编译所有版本库的代码。

在gcc我使用以下代码:

#ifdef RTSPServer::RTSPClientSession
    using ClientSessionClass = RTSPServer::RTSPClientSession;
#else
    using ClientSessionClass = GenericMediaServer::ClientSession;
#endif

class A
{
    .........
    virtual ClientSessionClass* createNewClientSession(u_int32_t sessionId)override;
};

但这在MSVC 2010中不起作用。 我怎么能检测到我应该使用哪个声明?

UPD:gcc的代码也不适用于旧版本的库:(

1 个答案:

答案 0 :(得分:2)

  

“我如何能够检测到我应该使用哪种声明?”

您需要为当前构建配置使用的库版本引入一些鉴别器:

#ifdef OLD_LIBRARY_VERSION // Maybe the binding headers have some information like this.
                           // If not you have to select this manually, and provide the 
                           // setting with your project configuration.
   using ClientSessionClass = RTSPServer::RTSPClientSession;
#else
   using ClientSessionClass = GenericMediaServer::ClientSession;
#endif