在C / C ++宏中同时使用{和#if

时间:2018-03-27 10:30:05

标签: c++ macros c-preprocessor

我需要编写一个大型类,我希望能够在Visual Studio中编辑并编译为Windows进行测试,但整个应用程序最终都会针对Android。

有问题的类只有Android特定代码(它将是gpg C ++ SDK的接口)。由于一系列复杂问题,我基本上不得不自己做这件事并用这样的东西包围每个功能的内容

GooglePlayManager::GooglePlayManager()
{
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID

    //code

#endif
}

因为否则它不能为Windows编译。理想情况下,我想在这个.cpp文件中定义类似的东西

#define BEGIN_ANDRO { #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#define END_ANDRO #endif }

但我无法让它发挥作用。有没有办法让这种情况发生,或者我可以考虑一个不错的替代方案?

2 个答案:

答案 0 :(得分:3)

预处理程序指令不能出现在宏中,但如下所示:

#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#  define FOO(...) __VA_ARGS__
#else
#  define FOO(...) {}
#endif

GooglePlayManager::GooglePlayManager() FOO({
    // ...
})

答案 1 :(得分:2)

在我看来,你有一个架构问题,你试图用宏来解决。

看起来你的GooglePlayManager有两种不同的实现方式,一种用于Android,另一种用于Windows(可能为空?)。

所以代码应该反映出来。定义一个通用接口,并为Windows和Android提供该接口的不同实现。

您可能会发现空的Windows实现可能会形成一个可用于单元测试的有用Mock or Stub object