Ошибка GCC при компиляции: «lvalue требуется как левый операнд присваивания» с указателем функции - PullRequest
1 голос
/ 06 марта 2011

У меня есть 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 отображает «error: lvalue требуется как левый операнд присваивания».Как я могу это исправить?Для моей цели я не мог вызвать напрямую AnyFunction ().

Ответы [ 3 ]

3 голосов
/ 06 марта 2011

Это расширится до:

   (type)xxx = ...

Это не законно. Тем не менее, вы можете использовать что-то вроде:

   * (type *)& xxx = ...
0 голосов
/ 06 марта 2011

Вместо определения lpProcAddress как void * почему бы просто не определить как MyFunction_TYPE, например:

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

MyFunction_TYPE lpProcAddress[5];

Тогда в вашей основной функции вы можете просто сделать:

lpProcAddress[0] = AnyFunction;

Без необходимостизаботиться о приведении.

Аналогично, чтобы вызвать функцию, вы можете просто сделать:

result = lpProcAddress[0]( some_ptr );
0 голосов
/ 06 марта 2011

Попробуйте назначить lpProcAddress[0] напрямую вместо MyFunctionInArray.

Это должно сработать, и вы можете просто оставить его таким.

Однако, если вам интересно, почему это не сработало с вашим определением, продолжайте чтение, есть способ сделать это тоже:

То, что вы делаете в вашем #define, приведенотип указателя на MyFunction_TYPE

1) вам действительно не нужно приводить массив указателей к чему-либо, вы можете просто назначить указатели на функции в его слоты

2), если вы действительно хотитеЧтобы привести массив указателей перед присваиванием в него, вы должны привести его к типу указателя функции (и сделать это до разыменования, поэтому используйте круглые скобки перед [0]).

...