C имеет правило для своих объявлений: объявления имитируют использование. Это означает, что объявление переменной выглядит так, как она используется. Например:
int i;
Использование этой переменной выглядит как i
, и это выражение приводит к int
.
int *i;
Использование этой переменной выглядит как *i
, и это выражение приводит к int
. Это также подразумевает, что выражение i
приводит к указателю на int
.
int i(void);
Использование этой переменной выглядит как i()
, и в результате получается int
. Это также подразумевает, что i
- это функция, которая ничего не берет и возвращает int
.
int (*i[5])();
Использование этой переменной выглядит как (*i[x])()
, и в результате получается int
. Это также означает, что *i[x]
- это функция, возвращающая int
, i[x]
- указатель на функцию, возвращающую int
, а i
- массив указателей на функции, возвращающие int
.
Итак:
int a, *b, c(void), (*d[5])(void);
объявляет несколько выражений, которые имеют тип int
, но сами переменные не все int
s.
N.B. в объявлениях функций и массивов вложенные объявления буквально не похожи на использование переменной. То есть int i[5];
не означает, что вам нужно заключить '5' в квадратные скобки, когда вы используете i
, а int i(int);
не означает, что вы вызываете функцию, говоря i(int);
. Также объявления переменных структурных типов не соответствуют их использованию, так как вам нужно было бы объявлять выражения для каждой переменной-члена.
С синтаксисом объявления переменных связан синтаксис typedefs. Чтобы объявить typedef с определенным типом, вы используете тот же синтаксис, что и для объявления переменной нужного типа, но вы вставляете typedef
перед объявлением, и имя переменной становится именем typedef.
typedef int (*array_of_function_pointers[5])(void);
C ++ добавляет ссылки, шаблоны, указатели на членов и кучу всего. Он в некоторой степени пытается следовать старому соглашению C, но это соглашение не очень хорошо работает для многих вещей, которые добавляет C ++, поэтому вы начинаете получать несоответствия. Вам просто нужно выучить идиосинкразии и объяснить это несовершенным браком между C и C ++.