programing

__stdcall이 뭐죠?

sourcetip 2022. 8. 8. 22:56
반응형

__stdcall이 뭐죠?

Win32 프로그래밍에 대해 배우고 있습니다.WinMain프로토타입은 다음과 같습니다.

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

나는 이게 뭔지 헷갈렸다.WINAPI식별자는 다음과 같습니다.

#define WINAPI      __stdcall

이게 뭘 하는 거지?반품 타입 후에 뭔가 있는 것 같아 혼란스럽습니다.뭐가__stdcall무엇 때문에? 반환 유형과 함수 이름 사이에 어떤 것이 있다는 것은 무엇을 의미합니까?

__stdcall는 함수에 사용되는 호출 규칙입니다.이를 통해 컴파일러는 스택 설정, 인수 푸시 및 반환값 취득에 적용되는 규칙을 알 수 있습니다.

그 밖에도 몇 가지 호출 규칙이 있습니다.__cdecl,__thiscall,__fastcall그리고 멋진 이름을 가진 사람들은__declspec(naked).__stdcall는 Win32 시스템콜의 표준 호출 규칙입니다.

위키피디아는 자세한 내용을 다룹니다.

이것은 주로 코드 이외의 함수를 호출할 때(예를 들어 OS API) 또는 OS가 호출할 때(여기 WinMain과 마찬가지로) 중요합니다.컴파일러가 올바른 호출 규칙을 인식하지 못하면 스택이 올바르게 관리되지 않기 때문에 매우 이상한 크래시가 발생할 수 있습니다.

C 또는 C++ 자체는 이러한 식별자를 정의하지 않습니다.이들은 컴파일러 확장자로 특정 호출 규약을 나타냅니다.이것에 의해, 인수의 배치 장소, 순서, 착신측의 함수가 리턴 주소를 검출하는 장소가 정해집니다.예를 들어 __fastcall은 함수 인수가 레지스터를 통해 전달됨을 의미합니다.

Wikipedia 문서에는 다양한 호출 규칙에 대한 개요가 나와 있습니다.

지금까지의 회답에서는 상세를 설명하고 있습니다만, 어셈블리로 이행할 생각이 없는 경우는, 발신자와 착신자 양쪽이 같은 발신 규약을 사용할 필요가 있는 것 뿐입니다.그렇지 않으면 버그를 발견하기 어려워집니다.

지금까지의 답은 모두 맞지만, 그 이유는 다음과 같습니다.Microsoft 의 C 및 C++ 컴파일러는, 애플리케이션의 C 및 C++ 함수내의 함수 호출의 속도(의도)에 관한 다양한 호출 규약을 제공합니다.어느 경우든, 발신자와 착신자는, 어느 콜 규약을 사용하는지에 대해 합의할 필요가 있습니다.현재 Windows 자체에서 함수(API)가 제공되고 있으며 이미 컴파일되어 있기 때문에 호출할 때는 해당 기능에 따라야 합니다.Windows API에 대한 콜 및 Windows API로부터의 콜백은 __stdcall 규칙을 사용해야 합니다.

__stdcall은 함수 인수를 스택에 넣기 위해 사용됩니다.기능이 완료되면 자동으로 메모리 할당이 해제됩니다.이것은 고정 인수에 사용됩니다.

void __stdcall fnname ( int, int* )
{
    ...
}

int main()
{
    CreateThread ( NULL, 0, fnname, int, int*...... )
}

여기서 fnname에는 arg가 있으며 스택에 직접 푸시됩니다.

다음 항목을 참조하십시오.

http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx

이는 함수가 호출되는 방식(기본적으로 스택에 배치되는 순서와 정리를 담당하는 사람)과 관련이 있습니다.

여기 매뉴얼이 있습니다만, 첫 번째 부분을 이해하지 않으면 큰 의미가 없습니다.
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspxhttpmsdn..com/en-us/library/zxk0tw93.aspx

저는 오늘까지 이걸 쓸 필요가 없었어요.왜냐하면 제 코드에서 저는 멀티스레딩을 사용하고 있고, 제가 사용하고 있는 멀티스레딩 API는 윈도 API(_beginthreadex)이기 때문입니다.

스레드를 시작하려면:

_beginthreadex(NULL, 0, ExecuteCommand, currCommand, 0, 0);

executeCommand 함수는 beginthreadex가 메서드시그니처 내에서 __stdcall 키워드를 사용해야 합니다.

unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
    return system(static_cast<char*>(command));
}

언급URL : https://stackoverflow.com/questions/297654/what-is-stdcall

반응형