(猜测)答案 = 因为记录是在由预处理器更改的标头宏中定义的。
那非常接近。记录是一个编译时特性:记录只是一个具有特殊布局的元组,在编译期间所有记录操作都转换为元组操作。
因此,鉴于此记录定义:
-record(foo, {a, b = default_b}).
Run Code Online (Sandbox Code Playgroud)
#foo{a = x}{foo, x, default_b}由编译器转换为,并且MyRecord#foo.x诸如element(MyRecord, 2). (除了它还检查这MyRecord是一条foo记录,badrecord否则会引发错误)
这就是您不能在运行时更改记录元素数量的原因:任何处理此类记录的代码都需要重新编译才能访问正确的字段。这类似于如果更改结构体的布局需要重新编译 C 代码的方式。