例行指向以结构体为参数的结构体指针。

3

我有一个鸡生蛋的问题。我想将一个数据结构传递给一个例程,该结构包含一个指向需要该结构的例程的指针。

我制作了一个非常简单的示例。

如果我在结构体后面添加CalcDataStruct,那么FuntctionPrototype未定义。

我遇到的问题只存在于前两行,其余部分可能包含一些语法错误,因为我还没有在编译器内检查过。

typedef void(*FunctionPrototype)(CalcDataStruct *Ptr);

struct CalcDataStruct 
{
  int A, B, C, D;
  int Values;
  char SignA, Sign B;
  int Result;
  FunctionPrototype Routine;
}


struct ScanStruct
{
  char Sign; 
  int Values;
  FunctionPrototype Routine;
};


const ScanStruct ExampleList[] =
{
   { '+', 2, AddTwo },
   { '+', 3, AddThree }
};

void AddTwo(CalcDataStruct *Ptr)
{
  // use the data and if needed put it back
}

void AddThree(CalcDataStruct *Ptr)
{
  // use the data and if needed put it back
}

void GetFunction(CalcDataStuct *Ptr, ScanStruct *List)
{
   // Very simple return based on nothing
   Ptr->Routine = *List[(1)].Routine;
}   

void main()
{
   CalcDataStruct A;
   // struct is filled

   // Fill in the routine pointer based on data
  GetFunction(A, ExampleList)
  // Execute the routine fetched with all the data
  A->Routine(A)
}

这是一个C还是C++的问题?请最多选择一个。 - fuz
移除了C标签。然而,解决方案对两者都有效。 - BWonder
1
这很可能,但事先无法确定。有些东西在C中可以工作,但在C++中不行,反之亦然。这就是为什么我们的政策是一次只询问一种语言的原因。 - fuz
1个回答

3
您需要添加前向声明(如下所示)。 struct CalcDataStruct; 只会声明 struct CalcDataStruct 存在,因此 typedef void(*FunctionPrototype)(CalcDataStruct *Ptr); 声明将成功,因为现在编译器知道 struct CalcDataStruct 存在但不知道结构的详细信息,但这并不重要,因为所有 FunctionPrototype 声明需要知道的是参数是指向 struct CalcDataStruct 的指针。
struct CalcDataStruct; // <<< add this

typedef void(*FunctionPrototype)(CalcDataStruct *Ptr);

struct CalcDataStruct 
{
  int A, B, C, D;
  int Values;
  char SignA, Sign B;
  int Result;
  FunctionPrototype Routine;
}

谢谢Michael,有时看到答案让我想,我怎么可能没想到这个。 - BWonder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接