Считывание синтаксиса указателя на функцию - PullRequest
2 голосов
/ 02 мая 2010

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

Начиная с здесь , здесь 2 примера указателя на функцию

typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();

Теперь я привык к чему-то вроде:

typedef vector<int> VectorOfInts ;

Который я читаю как

typedef vector<int> /* as */ VectorOfInts ;

Но я не могу прочитать вышеупомянутые 2 определения типа. Брекетинг и размещение звездочки, это просто не логично.

Почему * рядом со словом AddFunc ..?

Ответы [ 5 ]

5 голосов
/ 02 мая 2010

Когда вы понимаете это, просто игнорируйте typedef, скобки вокруг имени функции и звездочку перед именем. Тогда у вас есть int AddFunc(int,int);.

Смысл скобок в (*functionName) состоит в том, чтобы специально сгруппировать * с именем typedef. * необходимо указать, что это указатель на функцию .

Таким образом, любая функция, которая принимает два int s в качестве аргументов и возвращает int, соответствует AddFunc «интерфейсу», если хотите. Аналогично, любая функция, которая не принимает аргументов и возвращает void, может использоваться для FunctionFunc.

4 голосов
/ 02 мая 2010

Фактический тип первого -

int (*)(int,int);

(то есть указатель на функцию, которая принимает два параметра типа int и возвращает int)

* идентифицирует его как указатель на функцию. AddFunc - это имя typedef.

cdecl может помочь в идентификации особенно сложных типов или объявлений переменных.

3 голосов
/ 02 мая 2010

Я читаю typedef vector<int> /* as */ VectorOfInts ;

Вероятно, будет лучше, если вы увидите typedef как определение объекта с typedef, помещенным перед :

  • int i; определяет целочисленный объект
    typedef int t; определяет целое число тип .

  • vector<int> v; определяет векторный объект
    typedef vector<int> v; определяет вектор тип .

  • int (*AddFunc)(int,int) определяет указатель функции
    typedef int (*AddFunc)(int,int) определяет указатель функции тип .

Синтаксис объявления C, унаследованный C ++, является беспорядком. Я согласен, что typedef int (*)(int,int) AddFunc; будет иметь больше смысла. Но синтаксису декларации C 40 лет, он никогда не менялся и никогда не изменится. Тебе лучше привыкнуть к этому.

2 голосов
/ 02 мая 2010

Объявления функций выглядят так:

int AddFunc(int,int);
void FunctionFunc();

Определение типа, определяющее тип функции, выглядит одинаково, только с typedef впереди:

typedef int AddFunc_t(int,int);
typedef void FunctionFunc_t();

Чтобы определить указатель на такой тип функции, необходимо указать дополнительный * с дополнительными скобками, чтобы указать, к чему принадлежит *:

typedef int (*pAddFunc_t)(int,int);
typedef void (*pFunctionFunc_t)();

(* всегда перед именем типа / переменной, которое определено как указатель.)

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

0 голосов
/ 02 мая 2010

Звездочка указывает, что это функция POINTER:)

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