2010-08-18 2 views
1
CUnknown* (*)(LPUNKNOWN pUnk, HRESULT* phr); 

Кажется, я всегда был в беде чтение такие сложные указатели ..Как читать этот указатель в C++?

Как вы читали? что, если выражение еще длиннее?

+0

связанные: HTTP: // stackov erflow.com/questions/89056/how-do-you-read-c-declarations – jfs

+0

Взгляните на http://cdecl.org/ – SadSido

ответ

1

Clockwise Spiral Rule помогает мне понять такие вещи. На участке:

  1. Начиная с неизвестного элемента, перемещайтесь по спирали/по часовой стрелке; при замене следующих элементов замените их соответствующими английскими инструкциями:
  2. Продолжайте делать это по спирали/по часовой стрелке до тех пор, пока не будут покрыты все жетоны.

  3. Сначала разрешите что-нибудь в скобках!

    [X] или []

=> Массив X размер ... или массив не определен размер ...

(type1, type2) 

=> функция прохождения type1 и type2 возвращения. ..

* 

=> указатель (ей) ...

0

Это указатель на функцию, принимающую аргументы 'LPUNKNOWN pUnk, HRESULT * phr' и возвращает указатель на CUnknown.

0

это указатель на функцию с двумя параметрами, которая возвращает CUnknown *

+0

** Как ** прочитал ли это? – Alan

0

Я думаю, что это указатель на функцию, принимающую LPUNKNOWN и указатель на HRESULT, возвращающую указатель на CUnknown

3

Каждый сказал, что это такое, но вы спросили, как это прочитать.

синтаксис указателя функции выглядит следующим образом:

RETURN_VALUE (*POINTER_NAME) (ARGUMENT LIST) 

Так

foo (*bar) (baz) 

является указателем на функцию, принимая baz и возвращение foo, а указатель называется bar.

В случае, когда вы хотите написать тип указателя функции, а не объявлять его, вы просто не укажете имя, например.

RETURN_VALUE (*) (ARGUMENT_LIST) 

как вы видите здесь.

Для разбора трудно для понимания деклараций C, есть хорошая программа под названием cdecl доступны на большинстве Linux и Unix-подобных систем, а также доступен в виде веб-приложения: http://cdecl.org/

+0

Что делать, если это 'CUnknown * (***) (LPUNKNOWN pUnk, HRESULT * phr);'? действительно ли это? – Alan

+0

@Alan: '***' действительно. Он объявляет указатель на указатель на функцию. – jfs

+0

cdecl.org дает синтаксис ошибки как результат как для вашего вопроса, так и для вашего исходного утверждения. –

0

Для некоторой функции:

int f(int a, int& b, int* c); 

Тип выражения:

&f 

Или, что то же самое:

f 

Is:

int(*)(int, int&, int*) 

И простой способ запомнить это, что спецификатор типа указателя функции так же, как объявление функции, за исключением названия заменено (*). Вы также можете выполнить typedef:

typedef int(*ftype)(int, int&, int*); 

И теперь вы можете написать:

ftype func = f; 

Вместо того:

int(*func)(int, int&, int*) = f; 
3

То, что я узнал из книг и Uni должен был начаться в середине и выходят наружу взад и вперед.Хитрость заключается только в том, чтобы делать это медленно, и знать, где на самом деле середина.

У вас есть

CUnknown* (*)(LPUNKNOWN pUnk, HRESULT* phr); 

это указатель (*)

Теперь мы идем направо: это указатель на функцию, потому что следующая вещь является (

Аргументы функции являются a LPUNKNOWN и указатель на HRESULT, и все.

Теперь мы идем влево: функция возвращает указатель на CUnknown.

Итак, как было сказано всем, это указатель на функцию, которая принимает два аргумента -a LPUNKNOWN и указатель на HRESULT - и возвращает указатель на CUnknown.

Ссылка красавиц: this и this.

Смежные вопросы