#c
#c
Вопрос:
Что означает следующее объявление?
typedef int (amp;rifii) (int,int);
Это ссылка на функцию? Если да, не следует ли ее инициализировать?
Комментарии:
1. velocityreviews.com/forums/t287939-reference-to-a-function.html
Ответ №1:
Он определяет тип «ссылка на функцию, принимающую два int
значения и возвращающую int
«. Переменные этого типа должны быть инициализированы, но вы не можете поместить инициализатор в typedef. Это не отличается, например, от int
:
int i;
typedef intamp; intref; // no initializer allowed
intref ri(i); // initializer required
int f(int, int);
typedef int (amp;rifii) (int,int); // no initializer allowed
rifii rf(f); // initializer required
Комментарии:
1. Что вы имеете в виду под
initializer required
?2. @Nawaz: Под «Требуется инициализатор» я подразумеваю, что вы должны указать инициализатор, то есть инициализировать его в определении. Например, в
int a = 3;
части= 3
есть инициализатор. Как и(5)
вint b(5);
. В приведенном выше случае это означает, чтоintref ri;
была бы ошибка, потому что нет инициализатора, ноintref ri(i);
это нормально, потому что есть инициализатор (а именно(i)
).
Ответ №2:
Это typedef
, поэтому его нельзя «инициализировать», он просто вводит новое имя для типа «ссылка на функцию, возвращающую значение int и принимающую два целых числа в качестве аргументов».
Ответ №3:
Это ссылка на функцию, которая принимает два аргумента и тип возвращаемого значения которой является int
Typedef не инициализирован:
typedef int (amp;rifii) (int,int);
Когда вы объявляете ссылку типа rifii
, только тогда она должна быть инициализирована.
rifii r = foo;
Где ‘ foo
‘ — это функция, int foo(int, int);
Ответ №4:
Это typedef
ссылка на функцию. И typedef не может быть инициализирован. Подумайте о typedef int rank_t;
том, что инициализации тоже нет.
Ответ №5:
typedef
это все равно, что прийти на званый ужин и сказать привет, я Эд — на этом блюде нет мяса. Определение придаст плоти этим костям.
Комментарии:
1. Для тех, кто не может понять метафору. Это объявление.
2. Нет, это не так. Объявление будет гласить
extern int (amp;rifii) (int,int);
. Typedef — это нечто другое. В качестве более подходящей метафоры он говорит: «Привет, я Слартибартфаст. Но вы можете называть меня Slart. »3. Что ж, поскольку редактирование моего комментария завершилось неудачей, я добавляю к нему (и добавляю здесь атрибуцию at) этот дополнительный комментарий: На самом деле моя лучшая метафора все еще не очень хороша, потому что она по-прежнему предполагает один объект. Еще лучшей метафорой было бы, если бы биолог сказал: «Мы собираемся поговорить о canis lupus familiaris, но давайте просто скажем «собака».
4. Ретроспектива — замечательное блюдо, которое следует подавать холодным!. Сколько клинчей в этом!