programing

"cdecl"은 무엇의 약자입니까?

javamemo 2023. 7. 29. 08:05
반응형

"cdecl"은 무엇의 약자입니까?

네, 저는 "cdecl"이 저명한 호출 규약의 이름이라는 것을 알고 있기 때문에, 저에게 호출 규약에 대해 설명하지 마세요.제가 묻고 싶은 것은 "cdecl"의 약자(?)가 실제로 무엇을 의미하는지입니다.언뜻 보면 "C 선언자"(C의 다소 독특한 구문적 측면)를 연상시키기 때문에, 저는 그것이 좋지 않은 명명 선택이라고 생각합니다.사실, C 선언자를 해독하는 것이 유일한 목적인 cdecl이라는 프로그램이 있습니다.하지만 C 선언자 구문은 제가 아는 한 호출 규약과 전혀 관련이 없습니다.

단순화된 버전: "stdcall"은 "표준 통화 규약"을 나타냅니다."cdecl"은 무엇의 약자입니까?

이것은 선언된 C 함수에서 비롯됩니다(K&RC에서 일반적이었던 선언되지 않은 C 함수와는 대조적입니다).

그 당시에는 (발신자가 스택을 클리어한) 파스칼 호출 규약과 공존하고 있었기 때문에 프로그래밍 언어를 따서 부르는 것이 다소 타당했습니다.

전화 회의에 대해 알고 싶은 모든 것.

당신은 이것에 대해 너무 많은 것을 읽고 있어요.일반적으로 C 함수를 호출하기 위한 구현의 호출 규약을 나타냅니다(그러나 특히 변수에서 중요함).

"C"와 "선언"을 결합한 것의 줄임말일 필요는 없습니다. 이름은 단지 이름일 뿐입니다. 특히 프로그래밍에서 그렇습니다.니모닉은 도움이 되지만, "malloc"이 "메모리 할당"을 의미하더라도, "alloca"는 예를 들어 "메모리 할당"과 같은 우리가 알고 있고 그것에 부착하는 추가적인 의미를 가지고 있습니다.

또는 "구조"를 의미하는 "구조"를 예로 들 수 있습니다. 그러나 "구조"는 그 자체로 너무 일반적이기 때문에 의미 없이 "구조"에 잠재의식적으로 부착하지 않으면 우리는 절망적으로 길을 잃게 될 것입니다. 아직도 용어를 배우는 새로운 프로그래머들이 종종 잃어버리기 때문입니다.

C 선언.C가 도입한 선언문입니다.

[편집]

저는 솔직히 그것이 실제로 C에 의해 소개되기는 했지만 그것이 무엇을 의미하는지 실제로는 알지 못한다는 것을 인정해야 합니다.하지만 그 이후로caller대부분의 다른 호출 규칙과 달리 할당된 메모리를 정리해야 합니다.그것은 또한 'Caller Does End Cleaning'에 대한 기억법이 될 수도 있는데, 실제로는 좋은 기억 보조제라고 생각합니다. :D

CDELL이라는 용어는 Microsoft의 BASIC과 혼합 언어 프로그래밍 생태계에서 유래되었습니다.이 생태계는 마이크로소프트의 네 가지 주요 언어(베이직, 포트란, 파스칼 및 C)가 다른 언어로 전화를 걸 수 있도록 허용했습니다.각 언어는 약간 다른 호출 규약을 가지고 있었고, 각 언어는 특정 규약을 사용하기 위해 외부 함수나 절차를 선언하는 방법을 가지고 있었습니다.

BASIC은DECLARE로 외부 함수를 호출하기 .CALL. 또는 함수를 나타내기 외FORTRANPascal 프시또저는함수다나위기니록합부 중 하나를 .

DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()

C 호출 규약은 부분적으로 다른 언어들과 달랐는데, 그 이유는 인수가 역순으로 스택에 푸시되었기 때문입니다.CDELL 수식어를 추가하여 BASIC에 이 사실을 알립니다.

DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()

반대로 FORTRAN 또는 Pascal로 쓸 때 수식어는 [C]입니다.이것은 CDELL이 BASIC의 DECELL 문에 고유한 것이며 이전에 설정된 용어가 아님을 나타냅니다.그 당시에는 "C 호출 규약"에 대한 구체적인 용어가 없었습니다.WIN32(stdcall, fastcall 등)에 새로운 호출 규약이 등장한 후에야 "cdecl"이 공동 채택되어 다른 용어가 없는 경우 레거시 규약을 가리키는 사실상의 이름이 되었습니다.

요약하자면, CDELL은 "C 선언"을 의미합니다.C 컴파일러가 아닌 BASIC 컴파일러에서 기원했으며 임의로 선택한 BASIC 키워드였으며, 일반 "C"가 키워드가 될 수 없기 때문에 다소 중복되었습니다.

CDELL에 대한 자세한 내용은 1987년 문서에서 확인할 수 있습니다.

https://archive.org/details/Microsoft_Macro_Assembler_5.1_Mixed_Language_Programming_Guide/page/n1/mode/2up?q=cdecl

cdecl(C C (C 언선)의

호출 규약(calling convention)은 컴퓨터 과학에서 서브루틴이 호출자로부터 매개 변수를 수신하는 방법과 결과를 반환하는 방법에 대한 구현 수준(낮은 수준) 체계입니다.다양한 구현의 차이점으로는 매개 변수, 반환 값, 반환 주소 및 스코프 링크(레지스터, 스택 또는 메모리 등)가 배치되는 위치, 함수 호출을 준비하고 이후에 환경을 복원하는 작업이 호출자와 호출자 사이에 어떻게 구분되는지 등이 있습니다.

(소스)

호출 규칙은 특정 프로그래밍 언어의 평가 전략과 관련이 있을 수 있지만 대부분은 그 일부로 간주되지 않습니다(또는 그 반대의 경우도 있습니다.평가 전략이 일반적으로 더 높은 추상화 수준에서 정의되고 특정 언어 컴파일러의 낮은 수준의 구현 세부사항이 아닌 언어의 일부로 간주되기 때문입니다.

(소스)

cdecl(C 선언의 약자)는 C 프로그래밍 언어를 위한 마이크로소프트 컴파일러에서 유래한 호출 규약으로, 많은 C 컴파일러들이 x86 아키텍처를 위해 사용합니다.cdecl서브루틴 인수가 스택에서 전달됩니다.정수 값 및 메모리 주소는 에서 반환됩니다.EAX레지스터, 부동 소수점 값ST0x87 레지스터.레지스터EAX,ECX,그리고.EDX전화를 건 사람들이고, 나머지는 전화를 건 사람들입니다.x87 부동 소수점 레지스터ST0로.ST7새 함수를 호출할 때 비어 있어야 합니다(슬립 또는 해제됨).ST1로.ST7함수를 종료할 때는 비워 두어야 합니다.ST0값을 반환하는 데 사용하지 않는 경우에도 비워 두어야 합니다.

C 프로그래밍 언어의 맥락에서 함수 인수는 오른쪽에서 왼쪽 순서로 스택에 푸시됩니다. 즉, 마지막 인수가 먼저 푸시됩니다.

다음 C 소스 코드 스니펫을 생각해 보십시오.

int callee(int, int, int);

int caller(void)
{
    return callee(1, 2, 3) + 5;
}

x86에서 다음 어셈블리 코드(Intel 구문)를 생성할 수 있습니다.

caller:
    ; make new call frame
    ; (some compilers may produce an 'enter' instruction instead)
    push    ebp       ; save old call frame
    mov     ebp, esp  ; initialize new call frame
    ; push call arguments, in reverse
    ; (some compilers may subtract the required space from the stack pointer,
    ; then write each argument directly, see below.
    ; The 'enter' instruction can also do something similar)
    ; sub esp, 12      : 'enter' instruction could do this for us
    ; mov [ebp-4], 3   : or mov [esp+8], 3
    ; mov [ebp-8], 2   : or mov [esp+4], 2
    ; mov [ebp-12], 1  : or mov [esp], 1
    push    3
    push    2
    push    1
    call    callee    ; call subroutine 'callee'
    add     esp, 12   ; remove call arguments from frame
    add     eax, 5    ; modify subroutine result
                      ; (eax is the return value of our callee,
                      ; so we don't have to move it into a local variable)
    ; restore old call frame
    ; (some compilers may produce a 'leave' instruction instead)
    mov     esp, ebp  ; most calling conventions dictate ebp be callee-saved,
                      ; i.e. it's preserved after calling the callee.
                      ; it therefore still points to the start of our stack frame.
                      ; we do need to make sure
                      ; callee doesn't modify (or restores) ebp, though,
                      ; so we need to make sure
                      ; it uses a calling convention which does this
    pop     ebp       ; restore old call frame
    ret               ; return

호출자는 함수 호출이 반환된 후 스택을 정리합니다.

cdecl호출 규약은 일반적으로 x86 C 컴파일러의 기본 호출 규약이지만, 많은 컴파일러는 사용된 호출 규약을 자동으로 변경하는 옵션을 제공합니다.함수를 수동으로 정의하는 방법cdecl일부는 다음 구문을 지원합니다.

return_type __cdecl func_name();

호출 규칙은 호출 규칙의 이름입니다.__cdecl,__stdcall,__pascal그리고.__fastcall이 규칙을 지원하는 컴파일러의 C++ 함수 선언에 명시적으로 지정할 수 있습니다.__cdecl는 응용 프로그램 및 정적 라이브러리의 기본값입니다.__stdcall는 시스템 호출(Windows API 호출 포함)의 기본값이며 32비트 Windows의 라이브러리 DLL에 권장됩니다.__thiscallMicrosoft 컴파일러에서 기본적으로 16비트 및 32비트 모드의 멤버 함수에 사용됩니다.Microsoft, Borland, Watcom 및 Gnu는 컴파일러 브랜드입니다.Windows용 Intel 컴파일러는 Microsoft와 호환됩니다.Linux용 Intel 컴파일러는 Gnu와 호환됩니다.Symantec, Digital Mars 및 Codeplay 컴파일러는 Microsoft와 호환됩니다.64비트 모드에서는 각 운영 체제에 대해 하나의 기본 호출 규칙이 있지만 64비트 모드에서는 다른 호출 규칙이 거의 없습니다.

기타 협약:

  • __지각의
  • __fortran
  • __이 통화
  • __stdcall
  • __패스트콜
  • __msfastcall
  • __regcall
  • __전화걸기

(소스)

C는 함수와 변수의 개념을 가지고 있지만, 어셈블리어/머신 코드는 그렇지 않습니다.함수에 값을 전달하려면 CPU 레지스터를 사용하거나 레지스터의 고정 오프셋(일반적으로 지정된 스택 포인터)에 있는 메모리의 값을 사용해야 합니다.따라서 함수가 시작될 때 새 주소로 점프할 때 올바른 값이 올바른 위치에 있으므로 함수가 올바르게 수행됩니다.반환 값도 마찬가지입니다.

실제로 이 기능이 작동하는 방법은 시스템의 호출 규칙에 대해 설명하는 문서에 정의되어 있습니다.호출 규칙은 CPU 아키텍처와 운영 체제 모두에 고유한 것입니다.

x86 Windows에서는 여러 가지 호출 규칙이 사용됩니다."cdecl" 호출 규약에서 호출자는 호출자가 사용할 수 있도록 스택에 함수를 배치합니다.함수가 완료되면 호출자는 자신의 스택을 정리합니다.

윈도우즈 API는 호출자가 스택을 정리한다는 점을 제외하고는 cdelc와 유사한 "stdcall" 호출 규약을 사용합니다.(이는 vararg 함수 호출을 사용할 수 없음을 의미합니다.)코드 공간을 절약할 수 있는 이점이 있습니다.

Windows에는 매개 변수 전달을 위해 레지스터를 사용하는 "패스트콜" 호출 규약도 있습니다.

는 여러 규약을 C 컴파일러는 C 를 윈우가 여호규때허문에기용하, C러일는파다(cl)니확합으로 합니다.__cdecl,__stdcall그리고.__fastcall이것은 함수 선언을 장식하고 프로그래머가 사용된 호출 규칙을 지정할 수 있게 합니다.

ARM, Itanium 및 기타 플랫폼에는 자체 호출 규약이 있습니다.

CDELL에는 약어가 없습니다. 단지 호출 규약의 이름일 뿐입니다.

만약 그것이 당신이 찾던 것이 아니라 실제로 CDELL의 역사였다면:

마이크로소프트의 특정 호출 규약 속성(1985년에서 1995년 사이에 도입된 시점)으로, 나중에 표준이 되었습니다.

인터넷에서 페이지가 손실되는 것은 유감이지만(웨이백에도 아무것도 없음), 오래된 MSDN CD를 가지고 있는 사용자는 "C 언어 참조"에서 다음과 같이 명확하게 명시된 "선언 요약" 항목을 찾을 수 있습니다.

attribute-seq : /* attribute-seq는 Microsoft 고유 */입니다.

속성 attribute-seqopt 속성 : /* Microsoft Specific */ 중 하나

__asm __fastcall __based __cdecl __stdcall

또한 동일한 이전 MSDN 문서 __cdecl에서도

__cdecl 홈 | 개요 | 방법

마이크로소프트 관련 —>

이것은 C 및 C++ 프로그램에 대한 기본 호출 규칙입니다.스택은 호출자에 의해 정리되기 때문에 다양한 기능을 수행할 수 있습니다.__cdecl 호출 규약은 각 함수 호출에 스택 정리 코드가 포함되어야 하기 때문에 __stdcall보다 더 큰 실행 파일을 만듭니다.다음 목록은 이 호출 규칙의 구현을 보여줍니다.

그렇지 않으면, 우리는 모두 당신의 질문에 빠져있습니다 (수정해주세요) ;)

업데이트 내가 얼마나 잘못했는지 지적하는 댓글이 달린 후에 나는 이것을 완전히 수정했습니다.cdecl이 함수는 다음과 같은 호출 규약을 사용함을 의미합니다.C함수 사용.extern "C"추가로, 함수 이름이 수행되지 않아야 한다는 것을 의미합니다.C++명예 훼손의

라고 불리는 이유에 대해서는cdecl은 모르겠어요

언급URL : https://stackoverflow.com/questions/4986844/what-does-cdecl-stand-for

반응형