指向以结构为参数的结构的例程指针

Routine pointer to struct with struct as parameter

本文关键字:结构 例程 指针 参数      更新时间:2023-10-16

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

我举了一个非常简单的例子。

在定义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)
}

您需要添加一个正向声明(见下文)。

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;
}