3.2.2 函数调用约定 在底层系统开发、逆向工程、编译器构建,乃至高性能嵌入式驱动编写中,有一个看似沉默却无处不在的“契约”——它不显山露水,却决定着两个函数能否真正握手成功;它不参与业务逻辑,却左右着寄存器是否被意外覆盖、栈空间是否悄然溢出、返回值是否变成一串不可信的随机数。这个契约,就是函数调用约定(Calling Convention)。 你或许曾见过 、 、 、 这些修饰符,像一排冷峻的铭牌钉在函数声明前;你也可能在调试器里瞥见过 突然跳变、 被清空、 里躺着一个本该在栈上的 ——那一刻,不是编译器出了错,而是你和被调用函数之间,契约失效了。 这不是语法糖,不是风格偏好,而是一套由硬件架构、ABI规范、编译器策略与运行时环境共同签署的二进制级宪法。它规定:谁负责清理栈?