2017-08-01 54 views
-1

一个面试问题的cdecl关键字出现较强的混乱在我的脑海即让我们看看这个节目Pascal和C语言

#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

你的问题还不清楚。该程序无效C或Pascal。 – StoryTeller

+8

'cdecl'和'pascal'不是C语言的一部分,但是针对不同调用约定的编译器扩展。显然它们会影响参数传递给函数的方式。但是,当您调用具有错误数量参数的函数时,会发生什么情况并不是太有趣。我会认真的不想为一家使用它来筛选申请人的公司工作。 –

+0

您在Windows上使用Microsoft Compiler?你应该在你的问题中提到平台和编译器...... – Scheff

回答

3

(如Bo Persson已经暗示,这有(可能)与所谓调用约定

有一个在维基百科x86 calling conventions一个很好的解释

简短总结:不同的语言(或编译器)可能有不同的约定,函数的参数以何种顺序通过(例如堆栈)

如果要链接代码以不同语言编写的目标文件,这可以成为一个i ssue。因此,一些编译器有扩展来改变函数调用的调用约定。 (如果没有表示的本地使用,当然)。


Story Teller指出,(旁边的调用约定问题)有其他人在你的示例代码的东西是真的可疑。

原型conv1()conv2() in main有未指定的参数列表。这在C中是允许的(例如在SO: C: Unspecified number of parameters - void foo()中详细说明)。不幸的是,它可以防止发现错误的呼叫。

conv1() and conv2() have two each each。但是,两者都在main()中调用一个的说法。这是未定义的行为。

(谢谢你讲故事的人,让我认识到这一点。调用约定的事情,让我完全监督这个问题,以及在博Perssons注释的提示。)

+0

@StoryTeller我认为在C中,一个空的参数列表意味着函数可以接受任意数量的参数。如果你想声明一个不带参数的函数,你需要使用'void'?像:'void myfunc(void)'。 –

+1

@NikosC。不是真的。它只是意味着“未指定”(与变量/可变参数)。 – Scheff

+0

这看起来像一个评论,而不是OP的问题的答案。 – melpomene