/*
콜링 컨벤션 함수 호출 방식
함수 호출 방식으로는 두가지가 존재 한다.
하나는 파스칼방식이고 하나는 씨 방식이다.
씨방식은 인자를 뒤어서부터 읽어 온다.
즉 씨 방식의 함수 호출 방식은
void C_Style ( int a , int b , int c )
에서 c를 먼저 스택에 푸쉬를 한다. 그리고 b를 넣고 a를 넣는다.
파스칼 방식은 반대로 a를 넣고 b를 넣고 c를 넣게 된다.
이런 차이점으로 C 방식으로 하게 되면 언제 끝을 내야 하는지 모르는 위험이
뒤 따른다. c,b,a 하고 끝을 가리키는 것이 없기 때문이다.
그러나 이런 위험에도 불구하고 쓰는 이유는 가변 인자를 사용할수 있기 때문이다.
printf(char const* str, ...); 이 대표적 에이다.
... 은 가변 인자를 쓰겠다는 인자 표현이다. va_list로 이 인자를
하나씩 얻어 올수 있다 va_list로 가변인자 리스트 자료형을 선언 , va_start()
로 인자 처음 것을 얻어오고 va_end()로 끝을 va_arg()로 현재 인자의 형식을
알아 올수 있다.
그리고 차이점은 이 스택을 클리어하는(clean up) 주체가 씨방식은 이 함수를
부른 것이 하는 것이고 파스칼방식은 불려진 함수에서 클리어 한다는 점이다.
VC의 WINAPI는 pascal 과 같고
CALLBACK은 cdelc 이다.
-> VC의 WINAPI는 __stdcall이고
__stdcall 은 _stdcall 이며
stdcall 은 PASCAL방식이다.
*/
//////////////////////////////////////////////////
//
// Calling Convention Test Programming
// 98/06/26 jo kyung min
#include <conio.h>
#include <stdio.h>
int a()
{
printf("a......\n");
return 1;
}
int b()
{
printf("b......\n");
return 2;
}
void pascal printp(int a ,int b) // calling pascal-style
{
printf("%d %d",a,b);
}
void cdecl printc(int a ,int b) // calling c-style
{
printf("%d %d",a,b);
}
void main()
{
int i=0;
clrscr();
printp(a(),b());
printc(a(),b());
}
/*
a..........
b..........
b..........
a..........
*/
콜링 컨벤션 함수 호출 방식
함수 호출 방식으로는 두가지가 존재 한다.
하나는 파스칼방식이고 하나는 씨 방식이다.
씨방식은 인자를 뒤어서부터 읽어 온다.
즉 씨 방식의 함수 호출 방식은
void C_Style ( int a , int b , int c )
에서 c를 먼저 스택에 푸쉬를 한다. 그리고 b를 넣고 a를 넣는다.
파스칼 방식은 반대로 a를 넣고 b를 넣고 c를 넣게 된다.
이런 차이점으로 C 방식으로 하게 되면 언제 끝을 내야 하는지 모르는 위험이
뒤 따른다. c,b,a 하고 끝을 가리키는 것이 없기 때문이다.
그러나 이런 위험에도 불구하고 쓰는 이유는 가변 인자를 사용할수 있기 때문이다.
printf(char const* str, ...); 이 대표적 에이다.
... 은 가변 인자를 쓰겠다는 인자 표현이다. va_list로 이 인자를
하나씩 얻어 올수 있다 va_list로 가변인자 리스트 자료형을 선언 , va_start()
로 인자 처음 것을 얻어오고 va_end()로 끝을 va_arg()로 현재 인자의 형식을
알아 올수 있다.
그리고 차이점은 이 스택을 클리어하는(clean up) 주체가 씨방식은 이 함수를
부른 것이 하는 것이고 파스칼방식은 불려진 함수에서 클리어 한다는 점이다.
VC의 WINAPI는 pascal 과 같고
CALLBACK은 cdelc 이다.
-> VC의 WINAPI는 __stdcall이고
__stdcall 은 _stdcall 이며
stdcall 은 PASCAL방식이다.
*/
//////////////////////////////////////////////////
//
// Calling Convention Test Programming
// 98/06/26 jo kyung min
#include <conio.h>
#include <stdio.h>
int a()
{
printf("a......\n");
return 1;
}
int b()
{
printf("b......\n");
return 2;
}
void pascal printp(int a ,int b) // calling pascal-style
{
printf("%d %d",a,b);
}
void cdecl printc(int a ,int b) // calling c-style
{
printf("%d %d",a,b);
}
void main()
{
int i=0;
clrscr();
printp(a(),b());
printc(a(),b());
}
/*
a..........
b..........
b..........
a..........
*/
'KB > C/C++' 카테고리의 다른 글
C++과 객체 지향 (0) | 2004.03.19 |
---|---|
콤마에 대해서 (0) | 2004.03.19 |
재미로 보는 C/C++언어 (0) | 2004.03.19 |
생성자 계승 (0) | 2004.03.19 |
반올림하기 (0) | 2004.03.19 |