面试问题引起了我的强烈困惑,即让我们看看这个节目
#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书中提到的这个程序。
请帮助我更好地理解这个概念,以便我能更好地为我的面试做准备。
感谢您宝贵的时间。
答案 0 :(得分:3)
(如Bo Persson已暗示的那样,这可能(可能)与所谓的调用约定有关。
维基百科x86 calling conventions有一个很好的解释。
简短摘要:不同的语言(或编译器)可能有不同的约定,其中函数的参数的顺序是传递的(例如在堆栈上)。
如果要链接以不同语言编写代码的目标文件,这可能会成为一个问题。因此,一些编译器具有更改函数调用的调用约定的扩展。 (当然,如果没有使用本地语表示的话。)
Story Teller指出(除了调用约定问题),您的示例代码中还有其他内容可疑。
conv1()
中的原型conv2()
和main
具有未指定的参数列表。这在C中是允许的(例如在SO: C: Unspecified number of parameters - void foo()中详细说明)。不幸的是,它可以防止检测到错误的呼叫。
conv1()
和conv2()
各有两个参数。但是,两者都在main()
中使用一个参数调用。这是未定义的行为。
(谢谢故事讲述者让我认识到这一点。召集会议的事情让我完全监督这一点以及Bo Perssons评论中的暗示。)