Выберите определение структуры из нескольких на основе платформы - PullRequest
2 голосов
/ 08 марта 2019

Можно ли иметь одну структуру, но два определения, где определение выбирается с помощью макроса #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 голосов
/ 08 марта 2019

Для форвард-декларации как 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;
}
0 голосов
/ 08 марта 2019

Во-первых, объявление типа должно быть записано в файл '.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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...