Недавно был открыт мой основной язык программирования, j. источник. Чтобы улучшить его, я изучаю исходники, которые написаны на C.
Но прошло много времени (!) с тех пор, как я читал или писал C, и тогда я даже не был хорош в этом. И то, как написана эта конкретная кодовая база, является ... идиосинкразическим (многие интерпретаторы APL, в том числе J, имеют свой исходный код, написанный в высокоуровневом «стиле APL», даже если он написан на низкоуровневом языке; очень краткий, избыточность избегается , интенсивное использование макросов и т. д.)
На данный момент я пытаюсь понять основные структуры данных, которые он использует. Наиболее фундаментальным из них является typedef A
("A" для "массив"):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
что я прекрасно понимаю. Но я изо всех сил пытаюсь понять, что такое AF
двумя строками позже:
typedef A (*AF)();
Что означает этот синтаксис? В частности, что это означает, когда вещи позже объявляются как «тип AF»? Является ли AF
просто указателем на A
?
Моей непосредственной целью является интерпретация дампов памяти, которые включают элементы типа V
(для "verb"), первыми двумя членами которого являются AF
s:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
но моя общая цель шире, поэтому, пожалуйста, уточните синтаксис, используемый в определении AF.
AF
— это указатель на функцию, которая не принимает параметров и возвращаетA
. - person Sergey Kalinichenko   schedule 11.08.2015A
. Скорее всего, его следует определить какtypedef A (*AF)(void);
. Если он действительно предназначен для приема произвольного количества аргументов, то вы можете очень легко получить неопределенное поведение, вызвав функцию неправильно, без диагностики компилятора. - person Keith Thompson   schedule 11.08.2015()
, принимает фиксированное, но не указанное количество аргументов. Соответствующее определение определяет фактическое количество и тип(ы) параметров. Это устаревшая функция. Функция variadic, напримерprintf
, объявляется/определяется с помощью, ...
и принимает N фиксированных аргументов плюс 0 или более... - person Keith Thompson   schedule 11.08.2015A func(A)
иA func(A, A)
; это будут две разные функции, которые имеют одно и то же имя. C не поддерживает перегрузку, но вы можете определитьA func1(A)
иA func2(A, A)
. (Я не знаю J, поэтому не могу комментировать, как это работает.) - person Keith Thompson   schedule 11.08.2015