|
不管是做为程序员,还是编译器的开发者。
都想尽了一切办法,让错误提前。
所谓错误提前,就是让错误尽可能的在以下4个阶段里更早的阶段被发现:
编译错误,链接错误,运行时错误,逻辑错误(运行结果不符合预期)
如果接口不一致,编译器也不做检查,那么错误就会是运行时错误,如果运行时库也不检查,那就是运行崩溃。
所以优秀的编译器才会在编译链接时主动的去检查接口。
但做为程序员,不能一味的指望编译器来发现。万一编译器不发现呢?
在你的案例中,既然你的编译器给你了警告,我想,实际它在处理的时候,应该是主动为你考虑并填补了。
例如,如果编译器什么都不处理,调用者压入2个参数的堆栈。但被调用者只使用了1个,并且清理堆栈顶的时候按1个去清理,那么会产生堆栈失衡,导致运行崩溃。
如果你的程序能正常运行,可能是你的编译器自动为你做了处理,例如舍弃了第二个参数未压入堆栈。
另一个可能的情况是,你使用的是64位编译器,用的 x64 fast call 调用协定。那么2个参数是放入寄存器的,多放了一个寄存器也没关系。不需要清理堆栈,也不会造成失衡。所以程序能够运行。
不管怎么样,能够运行只是偶然的。去研究为什么会偶然,去研究到底编译器中间做了什么非语法严格强制规定的措施?对一个普通的 Fortran 程序员,没有什么价值。 |
|