What is the calling convention?
When a function is called, the arguments are typically passed to it, and the return value is retrieved.
A calling convention describes:
-->how the arguments are passed and values returned by functions.
Two calling Conventions:
1.)cdecl
2.)pascal
1.)cdecl
-->This convention is the default for C/C++ programs..
-->Arguments are passed from right to left, and placed on the stack.
-->Only the code that calls these functions knows for certain what it has placed on the stack.
So,stack cleanup is performed by the caller...
-->Support the variable argument functionality.
2.)pascal
-->Arguments are passed form left to right ,and placed on stack.
-->Stack cleanup is performed by the called function.
-->Does not support variable argument functionality.
Example:
#include<stdio.h>
#include<conio.h>
void pascal f(int i,int j,int k)
{
printf(“i=%d j=%d k=%d”,i, j, k);
}
void cdecl f1(int i,int j,int k)
{
printf(“i=%d j=%d k=%d”,i, j, k);
}
int main()
{
int i=50;
f1(i++,i++,i++);
printf("-->%d\n",i);
i=50;
f(i++,i++,i++);
printf("-->%d",i);
getch();
return 0;
}
output:
i=52 j=51 k=50-->53
i=50 j=51 k=52-->53
Explanation:
Strictly speaking the result is undefined , Read about the Sequence Points and Undefined Behavior .
now if we talk about a particular compiler implementation ,if that compiler produces "i=52 j=51 k=50" for cdecl convention(default for C) then it willl certainly give the output "i=50 j=51 k=52" for the pascal convention because they are opposite to each other..
When a function is called, the arguments are typically passed to it, and the return value is retrieved.
A calling convention describes:
-->how the arguments are passed and values returned by functions.
Two calling Conventions:
1.)cdecl
2.)pascal
1.)cdecl
-->This convention is the default for C/C++ programs..
-->Arguments are passed from right to left, and placed on the stack.
-->Only the code that calls these functions knows for certain what it has placed on the stack.
So,stack cleanup is performed by the caller...
-->Support the variable argument functionality.
2.)pascal
-->Arguments are passed form left to right ,and placed on stack.
-->Stack cleanup is performed by the called function.
-->Does not support variable argument functionality.
Example:
#include<stdio.h>
#include<conio.h>
void pascal f(int i,int j,int k)
{
printf(“i=%d j=%d k=%d”,i, j, k);
}
void cdecl f1(int i,int j,int k)
{
printf(“i=%d j=%d k=%d”,i, j, k);
}
int main()
{
int i=50;
f1(i++,i++,i++);
printf("-->%d\n",i);
i=50;
f(i++,i++,i++);
printf("-->%d",i);
getch();
return 0;
}
output:
i=52 j=51 k=50-->53
i=50 j=51 k=52-->53
Explanation:
Strictly speaking the result is undefined , Read about the Sequence Points and Undefined Behavior .
now if we talk about a particular compiler implementation ,if that compiler produces "i=52 j=51 k=50" for cdecl convention(default for C) then it willl certainly give the output "i=50 j=51 k=52" for the pascal convention because they are opposite to each other..
No comments:
Post a Comment
Feel free to comment......