编译时出现GCC错误:“左值操作数需要左值”,带有函数指针

时间:2011-03-06 12:44:54

标签: gcc compilation lvalue required

我有一个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()。

3 个答案:

答案 0 :(得分:3)

这将扩展为:

   (type)xxx = ...

这不合法。但是,您可以使用以下内容:

   * (type *)& xxx = ...

答案 1 :(得分:0)

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

这应该有用,你可以保持这种方式。

但是,如果您对为什么它不适用于您的定义保持阅读感兴趣,那么也有办法:

你在#define中所做的是向MyFunction_TYPE投射指针类型

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

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

答案 2 :(得分:0)

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

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

MyFunction_TYPE lpProcAddress[5];

然后在你的主要功能中你可以做到:

lpProcAddress[0] = AnyFunction;

无需关心施法。

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

result = lpProcAddress[0]( some_ptr );