Struct 抛出重新定义错误的结构的前向声明

Struct 抛出重新定义错误的结构的前向声明,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

这段代码正在使用gcc在不同的C环境中正确编译和运行。我正在使用G++将其移植到一个新的C++环境中,并获得了重新定义错误。 我见过类似的问题,但我的问题可能源于这样一个事实,即我在结构定义中有预声明,并且需要在实例化中再次预声明。以下是相关代码:

交易记录.h

...
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
关键字告诉编译器变量存在,就在其他地方。然后,带有初始化的声明应该可以正常工作