Это спросили мне в интервью! я действительно запутался
кто-либо мог помочь?
Typedef предназначены для wusses. Вот простой, механический метод определения сложных деклараций:
a -- a
a[N] -- is an N-element array
*a[N] -- of pointers
(*a[N])() -- to functions
*(*a[N])() -- returning pointers
(*(*a[N])())() -- to functions
*(*(*a[N])())() -- returning pointers
char *(*(*a[N])())() -- to char.
Итак, ответ находится в районе char * (* (* a [N]) ()) ();
. Я говорю «по соседству», поскольку никогда не оговаривается, какие аргументы принимают функции.
Это неприятный вопрос для собеседования (такие уродливые типы действительно редки для IME), но он дает интервьюеру представление о том, насколько хорошо вы понимаете деклараторов. Либо это, либо им было скучно, и они просто хотели посмотреть, смогут ли они заставить ваш мозг захлебнуться.
РЕДАКТИРОВАТЬ
Почти все остальные рекомендуют использовать typedef. Единственный раз, когда я рекомендую использовать typedef, - это если тип должен быть действительно непрозрачным (то есть, программист не манипулирует напрямую, а передается в API, что-то вроде типа FILE). В противном случае, если программист предназначен для непосредственного управления объектами этого типа, то для IME лучше, чтобы вся эта информация была доступна в объявлении, как бы некрасиво это ни было. Например, что-то вроде
NameFuncPickerPointer a[N];
не дает мне информации о том, как на самом деле использовать a [i]
. Я не знаю, является ли a [i]
вызываемым, или что он возвращает, или какие аргументы он должен принимать (если есть), или многое другое. Мне нужно найти typedef
typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;
и решить эту головоломку, как написать выражение, которое фактически вызывает одну из функций. Принимая во внимание использование "голого" объявления без определения типа, я сразу знаю, что структура вызова
char *theName = (*(*a[i])())();
Разделите большую проблему на более мелкие части:
/* char_func_ptr is pointer to function returning pointer to char */
typedef char* (*char_func_ptr)();
/* func_func_ptr is a pointer to function returning above type */
typedef char_func_ptr (*func_func_ptr)();
/* the_array is array of desired function pointers */
func_func_ptr the_array[42];
Это то, что вы ищете:
typedef char* charptr;
typedef charptr (*innerfun)();
typedef innerfun (*outerfun)();
const size_t N = 10;
outerfun my_outerfun_array[N];
Надеюсь, я понял правильно, мне это кажется странным вопросом, особенно в интервью: (
Использование typedef, как говорит вам Кристофер, на самом деле единственный гуманный способ объявить такую вещь . Без tyedefs это будет:
char *(*(*arr[10])(void ))(void );
(да, мне пришлось обмануть и запустить cdecl> declare arr как массив 10 указателя на функцию (void), возвращающий указатель на функцию (void), возвращающий указатель на char)
typedef char* (* tCharRetFunc)();
typedef tCharRetFunc (* tFuncRetCharFunc)();
tFuncRetCharFunc arr[N];