我的主要编程语言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
的指针吗?
我的直接目标是解释包括type V
的东西的内存转储(用于“verb”),其前两个成员是AF
。
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
但我的总体目标不仅限于此,请详细阐述在定义AF时所使用的语法。
AF
是一个指向不带参数且返回类型为A
的函数的指针。 - Sergey KalinichenkoA
的函数的typedef 。非常可能应该定义为typedef A (*AF)(void);
。如果它确实意味着要接受任意数量的参数,则通过错误调用函数很容易导致未定义行为,并且编译器也不会给出任何诊断信息。 - Keith Thompson()
声明的函数接收固定但未指定数量的参数,而对应的定义则确定了实际的参数数量和类型。这是一个过时的特性。与之相反,变参函数(例如printf
)在声明/定义时使用, ...
,它接受N个固定参数以及0个或多个省略号(...)。 - Keith Thompson