我有一个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()。
这将扩展到:
(type)xxx = ...
这不合法。但是,您可以使用以下内容:
* (type *)& xxx = ...
尝试直接分配给lpProcAddress[0]
而不是MyFunctionInArray
。
这应该工作,你可以保持这种方式。
但是,如果您对为什么它不适用于您的定义保持阅读感兴趣,那么也有一种方法可以做到:
你在#define
中所做的是向MyFunction_TYPE投射指针类型
1)你真的不需要将指针数组转换为任何东西,你可以只将函数指针分配到它的插槽中
2)如果你真的想在指定数组之前转换指针数组,你必须将其转换为函数指针类型(并在解除引用之前执行此操作,因此在[0]
之前使用括号)。
而不是将lpProcAddress定义为void *为什么不定义为MyFunction_TYPE,例如:
typedef unsigned long (*MyFunction_TYPE) (void*);
MyFunction_TYPE lpProcAddress[5];
然后在你的主要功能中你可以做到:
lpProcAddress[0] = AnyFunction;
无需关心铸造。
同样,调用该函数,您可以这样做:
result = lpProcAddress[0]( some_ptr );