0

一个面试问题在我脑海中引起了强烈的困惑,即让我们看看这个程序

#include "stdio.h"

int main()
{
    static int a=25;
    void cdecl conv1();
    void pascal conv2();
    conv1(a);
    conv2(a);
    return 0;
}

void cdecl conv1(int a,int b)
{
    printf("%d%d", a, b);
}

void pascal conv2(int a,int b)
{
    printf("\n%d%d", a, b);
}

输出是

25 0

0 25

但为什么?如何?

你能简单地给我解释一下吗,因为我不明白 UGC 书中提到的这个程序。

请帮助我更好地理解这个概念,以便我更好地准备我的面试。

感谢您宝贵的时间。

4

1 回答 1

3

(正如Bo Persson已经暗示的那样,这(可能)与所谓的调用约定有关。

维基百科x86 调用约定中有一个很好的解释。

简短摘要:不同的语言(分别是编译器)可能有不同的约定,函数参数的传递顺序(例如在堆栈上)。

如果您想链接以不同语言编写代码的目标文件,这可能会成为一个问题。因此,一些编译器具有扩展来更改函数调用的调用约定。(当然,如果没有表示使用本机。)


Story Teller指出(除了调用约定问题之外)您的示例代码中还有其他一些东西非常可疑。

原型conv1()conv2()inmain具有未指定的参数列表。这在 C 中是允许的(例如在SO: C: Unspecified number of parameters - void foo()中详细说明)。不幸的是,它阻止了错误调用的检测。

conv1()并且每个conv2()都有两个参数。但是,两者都main()一个参数调用。这是未定义的行为。

(感谢讲故事的人让我认识到这一点。呼叫约定让我完全监督了这一点以及 Bo Perssons 评论中的提示。)

于 2017-08-01T10:27:16.000 回答