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

问题描述 投票:1回答:3

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

gcc compilation lvalue required
3个回答
3
投票

这将扩展到:

   (type)xxx = ...

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

   * (type *)& xxx = ...

0
投票

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

这应该工作,你可以保持这种方式。

但是,如果您对为什么它不适用于您的定义保持阅读感兴趣,那么也有一种方法可以做到:

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

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

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


0
投票

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

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

MyFunction_TYPE lpProcAddress[5];

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

lpProcAddress[0] = AnyFunction;

无需关心铸造。

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

result = lpProcAddress[0]( some_ptr );
© www.soinside.com 2019 - 2024. All rights reserved.