根据平台从多个结构定义中选择

时间:2019-03-08 12:48:15

标签: c++ api cross-platform

是否可以有一个结构,但有两个定义,可以通过#define宏选择定义?例如:

platform.h

struct Context;

platform_win32.cc:

#include "platform.h"

struct Context
{
  // win32 specific implementation..
  bool win;
}

platform_linux.cc:

#include "platform.h"

struct Context
{
  //Linux specific implementation..
  bool lin;
}

platform.cc:

#define WIN32 //For testing reasons

#ifdef WIN32
  #include "platform_win32.cc"
#endif

#ifdef LINUX
  #include "platform_linux.cc"
#endif

main.cc:

#include "platform.h"

int main()
{
  Context *context = new Context;
  context->win=true;

  return 0;
}

但是,这不会编译并返回:

error: invalid use of incomplete type 'struct Context'
note: forward declaration of 'struct Context'

我该如何解决?

2 个答案:

答案 0 :(得分:0)

首先,应将类型的声明写入“ .h”文件,而不是“ .cc”或“ .c”文件。

第二,您可以像以前一样,通过#define为不同的平台声明不同类型的结构。

例如:

platform_win32.h:

struct Context
{
  // win32 specific implementation..
  bool field1;
  bool field2;
  bool field_win_specified;
}

platform_linux.h:

struct Context
{
  //Linux specific implementation..
  bool field1;
  bool field2;
  bool field_linux_specified;
}

platform.h:

#ifdef WIN32
  #include "platform_win32.h"
#endif

#ifdef LINUX
  #include "platform_linux.h"
#endif

main.cc:

#include "platform.h"

int main()
{
  Context *context = new Context;
  context->field1=true;

  return 0;
}

答案 1 :(得分:0)

对于struct Context;之类的前向声明

主要规则是,您只能在不需要预先声明的文件中知道内存布局(以及成员函数和数据成员)的地方使用

可能的解决方法:

platform.h

#define WIN32 //For testing reasons

#ifdef WIN32
  #include "platform_win32.h"
#endif

#ifdef LINUX
  #include "platform_linux.h"
#endif

platform_win32.h

struct Context
{
  // win32 specific implementation..
  bool win;
}

platform_linux.h

struct Context
{
  //Linux specific implementation..
  bool lin;
}

main.cc

#include "platform.h"

int main()
{
  Context *context = new Context;
  context->win=true;

  return 0;
}