본문 바로가기
공부,일/어셈블리

__cdecl vs __stdcall

by fromnothing1 2021. 8. 13.

1. __cdecl 

 스택에 쌓은 피라미터를 호출한함수에서 제거 

#include <stdio.h>
 
int __cdecl cdeclFunction(int a, int b)
{
    return a + b;
}
 
int main()
{
    int varA = 1, varB = 2;
    cdeclFunction(1, 2);
    
    return 0;
}

즉 위의 코드를 보면 main 함수에서 cdeclFuction 을 call 한후에 main 함수 내에서 

esp(스택포인터) 를 관래해준다. ( cdeclFuction  사용한 스택 clear)

2. __stdcall

스택을 call 한 함수 안에서 정리를 해준다. 즉  stdcallFunction 안에서 정리를 해준다. 

#include <stdio.h>
 
int __stdcall stdcallFunction(int a, int b)
{
    return a + b;
}
 
int main()
{
    int varA = 1, varB = 2;
    cdeclFunction(1, 2);
    
    return 0;
}

 

상세

사실 위의 설명을 보면 별 차이가 없다 결국 어디서 스택을 정리하는지 차이지 별차이가 없어 보인다. 

 

하지만 결정적인 차이가 2가지 존재한다. 

 

1. 가변인자 사용 stdcall 의 경우 call 된 함수 내에서 스택을정리하기 때문에 가변인자를 사용할 경우 얼마나 정리해야 하는지 몰라서 가변인자를 사용할 수 없다. 

 

하지만 cdecl 의 경우 가변인자를 넘겨주는 main 함수안에서 스택을 정리하기 때문에 얼마만큼의 스택을 정리해야하는지 알고있기 때문에 가변인자를 사용할 수 있다. 

 

2. stdcall 은 표준이다. 

다른 프로그램 언어와 호환을위해서는 표준이 있어야 하는데 stdcall 함수가 표준으로 정해져 있기 때문에 호환을 위해서는 stdcall 함수를 사용해야 한다. 

 


출처: https://changmyeong.tistory.com/10 

출처 : https://blog.naver.com/kimchulgoon/30024494772

댓글