是否可以有一个结构,但有两个定义,可以通过#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'
我该如何解决?
答案 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;
}