考虑下面的空C程序(标准保证编译器执行隐式return 0):

int main(int argc, char* argv[]) {}

您可以在这个函数中添加任何操作argcargv的逻辑。然而,当main完成时,它的汇编代码将只执行一个简单的ret而不是ret 4。我希望看到一个ret 4,因为在我看来main是其他函数的被调用方,因此必须从堆栈中清除它的两个参数:int和指向char数组的指针。为什么不这样做?

最佳答案

大多数编译器都选择让调用者清除堆栈中的参数;这一传统可以追溯到早期的C编译器和处理参数的数量。在调用位置,编译器知道它推送了多少,所以调整堆栈很简单。
另外,请注意,历史main可以用0-3(arge)参数指定。同样,调用者(例如,start)可以只提供3,让实现者选择。

关于c - 为什么`main`结尾于`ret`而不是`ret 4`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47000454/

10-13 08:49