Что означает typedef A (* AF)()?

Мой основной язык программирования, , был недавно открытым. Чтобы улучшить его, я изучаю источник, который написан на C.

Но это было длинное (!) время с тех пор, как я прочитал или написал C, и тогда я даже не был хорош в этом. И то, как написано эту конкретную кодовую базу, является... особенным (многие интерпретаторы APL, среди них J, имеют свой источник, написанный на высоком уровне "стиль APL", даже когда они написаны на языке низкого уровня, очень кратки, избыточность избегана, использование тяжелых макросов и т.д.)

В настоящий момент я пытаюсь понять основные структуры данных, которые он использует. Наиболее фундаментальным является typedef A ( "A" для "array" )

typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;

который я понимаю. Но я изо всех сил пытаюсь обернуть голову тем, что AF, две строки позже:

typedef A (*AF)();

Что означает этот синтаксис? В частности, что это значит, когда вещи позже объявляются как "тип AF"? Является ли AF просто указателем на A?

Моя ближайшая цель - интерпретировать дампы памяти, которые включают вещи type V (для "verb" ), чьи первые два члена AF s:

typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;

но моя общая цель больше, поэтому, пожалуйста, уточните синтаксис, используемый в определении AF.

Ответы

Ответ 1

Как уже было сказано, AF (Array Function) является указателем на функцию, которая возвращает A (указатель объекта Array).

В определении V (Verb, т.е. функциональный объект) есть два AF s. v1 - это указатель на реализацию монадической функции, а v2 - указатель на двоичную функцию. Если V представляет собой оператор (наречие), то v1 и v2 по-прежнему являются монадическими и двоичными реализациями соответственно, но также f g и h могут использоваться для удерживания (в валюте) влево и/или правильные аргументы. mr lr и rr являются соответственно монадическим рангом, левым и правым рангами. И id содержит код операции, поэтому печатное представление все еще может быть восстановлено из структуры.

Если какой-либо из операндов в f g или h являются самими глаголами, их структура V будет находиться в f- > k байтах в прошлом * f, соответственно для g и h, как и всякая "полезная нагрузка данные".

Очень полезная ссылка, которую я нашел для понимания основных типов в реализации J, - Заметки о разводе Roger Hui BAA (2.69M отсканированный pdf), И полная запись находится в Реализация J (html).

Вы также можете найти мой примитивный клон поучительный. См. Также мои вопросы здесь и здесь.

Ответ 2

AF - это typedef для указателя функции. В частности, AF относится к указателю на функцию, которая принимает неопределенное количество параметров и возвращает результат типа A.

Ответ 3

Не будем игнорировать то, что A на самом деле. Затем у вас

typedef int (*AF)();

AF - это указатель на функцию (aka function pointer), которая принимает любое количество аргументов и возвращает int. Ясно, что, заменив int на A, контент по существу тот же, что и тип возврата; конечный результат поэтому квалифицирует AF как указатель на функцию, принимающую любое количество аргументов, и возвращает A, псевдоним для указателя на анонимную структуру.

Здесь есть интересный сайт, который может помочь преобразовать сложные объявления в текст, читаемый человеком.