1

我有一个 C 代码,它在数组中记录一个过程地址

void* lpProcAddress[5];

typedef unsigned long (*MyFunction_TYPE) (void*);
#define MyFunctionInArray ( (MyFunction_TYPE) lpProcAddress[0] )

unsigned long AnyFunction ( void* lpPointerToAny )
{
   /* Some Code */
   return 0;
}
int main()
{
   MyFunctionInArray = 
      AnyFunction; // Displays: "error: lvalue required as left operand of assignment"
}

GCC 显示“错误:需要左值作为赋值的左操作数”。我怎样才能解决这个问题?出于我的目的,我不能直接调用 AnyFunction()。

4

3 回答 3

3

这将扩展为:

   (type)xxx = ...

这是不合法的。但是,您可以使用类似的东西:

   * (type *)& xxx = ...
于 2011-03-06T12:59:51.977 回答
0

尝试lpProcAddress[0]直接分配 to 而不是 to MyFunctionInArray

这应该有效,您可以保持这种状态。

但是,如果您对它为什么不能与您的定义继续阅读感兴趣,也有一种方法可以做到这一点:

您正在做的#define是将指针类型转换为 MyFunction_TYPE

1)你真的不需要将指针数组转换为任何东西,你可以将函数指针分配到它的插槽中

2)如果您真的想在分配指针数组之前对其进行转换,则必须将其转换为函数指针类型(并在取消引用之前执行此操作,因此在 之前使用括号[0])。

于 2011-03-06T12:51:17.277 回答
0

与其将 lpProcAddress 定义为 void*,不如将其定义为 MyFunction_TYPE,例如:

typedef unsigned long (*MyFunction_TYPE) (void*);    

MyFunction_TYPE lpProcAddress[5];

然后在您的主要功能中,您可以执行以下操作:

lpProcAddress[0] = AnyFunction;

无需关心铸造。

同样要调用该函数,您可以这样做:

result = lpProcAddress[0]( some_ptr );
于 2011-03-06T13:05:45.120 回答