/*
        콜링 컨벤션  함수 호출 방식
함수 호출 방식으로는 두가지가 존재 한다.

하나는 파스칼방식이고 하나는 씨 방식이다.

씨방식은 인자를 뒤어서부터 읽어 온다.

즉 씨 방식의 함수 호출 방식은

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

+ Recent posts