CUnknown* (*)(LPUNKNOWN pUnk, HRESULT* phr);
Кажется, я всегда был в беде чтение такие сложные указатели ..Как читать этот указатель в C++?
Как вы читали? что, если выражение еще длиннее?
CUnknown* (*)(LPUNKNOWN pUnk, HRESULT* phr);
Кажется, я всегда был в беде чтение такие сложные указатели ..Как читать этот указатель в C++?
Как вы читали? что, если выражение еще длиннее?
Clockwise Spiral Rule помогает мне понять такие вещи. На участке:
Продолжайте делать это по спирали/по часовой стрелке до тех пор, пока не будут покрыты все жетоны.
Сначала разрешите что-нибудь в скобках!
[X] или []
=> Массив X размер ... или массив не определен размер ...
(type1, type2)
=> функция прохождения type1 и type2 возвращения. ..
*
=> указатель (ей) ...
Это указатель на функцию, принимающую аргументы 'LPUNKNOWN pUnk, HRESULT * phr' и возвращает указатель на CUnknown.
это указатель на функцию с двумя параметрами, которая возвращает CUnknown *
** Как ** прочитал ли это? – Alan
Я думаю, что это указатель на функцию, принимающую LPUNKNOWN и указатель на HRESULT, возвращающую указатель на CUnknown
Каждый сказал, что это такое, но вы спросили, как это прочитать.
синтаксис указателя функции выглядит следующим образом:
RETURN_VALUE (*POINTER_NAME) (ARGUMENT LIST)
Так
foo (*bar) (baz)
является указателем на функцию, принимая baz
и возвращение foo
, а указатель называется bar
.
В случае, когда вы хотите написать тип указателя функции, а не объявлять его, вы просто не укажете имя, например.
RETURN_VALUE (*) (ARGUMENT_LIST)
как вы видите здесь.
Для разбора трудно для понимания деклараций C, есть хорошая программа под названием cdecl
доступны на большинстве Linux и Unix-подобных систем, а также доступен в виде веб-приложения: http://cdecl.org/
Что делать, если это 'CUnknown * (***) (LPUNKNOWN pUnk, HRESULT * phr);'? действительно ли это? – Alan
@Alan: '***' действительно. Он объявляет указатель на указатель на функцию. – jfs
cdecl.org дает синтаксис ошибки как результат как для вашего вопроса, так и для вашего исходного утверждения. –
Для некоторой функции:
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;
То, что я узнал из книг и Uni должен был начаться в середине и выходят наружу взад и вперед.Хитрость заключается только в том, чтобы делать это медленно, и знать, где на самом деле середина.
У вас есть
CUnknown* (*)(LPUNKNOWN pUnk, HRESULT* phr);
это указатель (*)
Теперь мы идем направо: это указатель на функцию, потому что следующая вещь является (
Аргументы функции являются a LPUNKNOWN
и указатель на HRESULT
, и все.
Теперь мы идем влево: функция возвращает указатель на CUnknown
.
Итак, как было сказано всем, это указатель на функцию, которая принимает два аргумента -a LPUNKNOWN
и указатель на HRESULT
- и возвращает указатель на CUnknown
.
связанные: HTTP: // stackov erflow.com/questions/89056/how-do-you-read-c-declarations – jfs
Взгляните на http://cdecl.org/ – SadSido