Что означает этот тип приведения? - PullRequest
2 голосов
/ 11 марта 2012

Я видел фрагмент кода, подобный этому:

#include <windows.h>
static VOID (WINAPI * pFun) (DWORD seconds) = NULL;

void foo(PVOID * par){
    return;
}

int main(){
    foo(&(PVOID&) pFun); // type-cast 1
    foo((PVOID *) (&pFun)); // type-cast 2
    return 0;
}

Я могу понять приведение типа 2, но как работает приведение типа 1?

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Прежде всего, вы используете C ++.

In windows.h VOID и PVOID определены как void и void* соответственно.

#define VOID void

typedef void *PVOID;

Давайте рассмотрим базовую программу:

#include <iostream>

using namespace std;

void foo(void** pp)
{
  int i = *((int*) *pp);
  cout << i << endl;
}

int main()
{
  int i = 10;
  int *p = &i;

  foo((void**) &p); // call #1
  foo(&(void*&) p); // call #2
}

В первом случае мы берем адрес p, то есть int**, и передаем его в foo(), приводя его к void**.

Во втором случае мы сначала приводим p к void*&, а затем берем его адрес, который будет void**, и передаем его foo(). Причина void*&, а не void* в том, что вы можете использовать унарный оператор & (адрес) только для lvalue .

0 голосов
/ 12 марта 2012

(PVOID&) pFun заставляет компилятор обрабатывать pFun как PVOID и получает его адрес, фактически передавая PVOID* в качестве параметра.

Этот тип приведения (TYPE&) интерпретирует память так, как если бы она представляла TYPE.

Кроме того, я знаю, что в C ++ вы можете автоматически взять адрес функции, написав foo вместо &foo, не уверенный, поддерживается ли он в чистом C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...