Почему круглые скобки важны в объявлении указателя функции? - PullRequest
5 голосов
/ 13 декабря 2010

Я не понимаю, почему принята декларация ниже:

typedef void    (*_tStandardDeclaration)(LPVOID);

, в то время как следующее не:

typedef void    *_tDeclarationWithoutParenthesis(LPVOID);
typedef void*   _tAlternateDeclaration(LPVOID);

Я использую MSVC6 (я знаю, что он устарел и нестандартен, но необходимо поддерживать ежегодную систему дохода на десятый миллион: /)

Ответы [ 3 ]

12 голосов
/ 13 декабря 2010

Символ указателя привязывается к типу по умолчанию, поэтому указателю функции требуется скобка, чтобы указать, что указатель действительно находится на имени, а не на возвращаемом типе.

6 голосов
/ 13 декабря 2010

Без скобок вы объявляете функцию, возвращающую void*, а не указатель на функцию, возвращающую void.

4 голосов
/ 13 декабря 2010

GCC 4.2.1 на MacOS X 10.6.5 без кода принимает код, указанный ниже:

c++ -Wall -Wextra -c xx.cpp

Код:

typedef void *LPVOID;

typedef void    (*_tStandardDeclaration)(LPVOID);

typedef void    *_tDeclarationWithoutParenthesis(LPVOID);
typedef void*   _tAlternateDeclaration(LPVOID);

сначала дает указатель на функцию, возвращающую void;последние два эквивалентны (интервал не имеет значения) и дают вам тип 'функция (с аргументом LPVOID), который возвращает указатель на void'.

Вы можете использовать их для объявления указателей на функции:

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer;

Забавно, не правда ли ...

...