Struct 抛出重新定义错误的结构的前向声明
这段代码正在使用gcc在不同的C环境中正确编译和运行。我正在使用G++将其移植到一个新的C++环境中,并获得了重新定义错误。 我见过类似的问题,但我的问题可能源于这样一个事实,即我在结构定义中有预声明,并且需要在实例化中再次预声明。以下是相关代码: 交易记录.hStruct 抛出重新定义错误的结构的前向声明,struct,g++,typedef,forward-declaration,redefinition,Struct,G++,Typedef,Forward Declaration,Redefinition,这段代码正在使用gcc在不同的C环境中正确编译和运行。我正在使用G++将其移植到一个新的C++环境中,并获得了重新定义错误。 我见过类似的问题,但我的问题可能源于这样一个事实,即我在结构定义中有预声明,并且需要在实例化中再次预声明。以下是相关代码: 交易记录.h ... typedef int ( *pfnTrans)(transaction *); typedef struct tag_TRANSTEP transStep; //forward declare this for the f
...
typedef int ( *pfnTrans)(transaction *);
typedef struct tag_TRANSTEP transStep; //forward declare this for the following struct.
typedef struct tag_RETURNMAP
{
int onThisReturn;
transStep * runThis;
}returnMap;
#define MAX_BRANCHES 10
struct tag_TRANSTEP
{
pfnTrans thisStepsFunction;
returnMap retMap[MAX_BRANCHES];
};
...
source.cpp
...
//Forward declaring the steps, since they reference one another.
transStep tsConsultChoreList;
transStep tsPayBills;
transStep tsMowLawn;
transStep tsFixLawnMower;
transStep tsConsultChoreList = {fnConsultChoreList, {{MOW_LAWN, &tsMowLawn},
{PAY_BILLS, &tsPayBills},
{0, NULL}}}; // this entry signifies end of returnMap
transStep tsPayBills= {fnPayBills, {{SUCCESS, &fnConsultChoreList},
{0, NULL}}}; // this entry signifies end of returnMap
transStep tsMowLawn= {fnMowLawn, {{SUCCESS, &tsConsultChoreList},
{FIX_MOWER, &tsFixLawnMower},
{0, NULL}}}; // this entry signifies end of returnMap
transStep tsFixLawnMower= {fnFixLawnMower, {{SUCCESS, &tsMowLawn},
{0, NULL}}}; // this entry signifies end of returnMap
...
我没有从.h文件中得到任何错误,但是对于.cpp中的每个transStep,我都会得到一个“重新定义的…”错误和一个伴随的“…以前在这里声明的”错误。这在C中是合法的吗?这在C++中是不合法的。如果您在“predeclarations”前面加上
extern
extern transStep tsConsultChoreList;
extern transStep tsPayBills;
// etc...
它应该会起作用。在.h文件中,您是预删除类型,而不是类型的实例。在.cpp文件中,您声明了实际实例,告诉编译器为它们分配空间。extern
关键字告诉编译器变量存在,就在其他地方。然后,带有初始化的声明应该可以正常工作