다음을 통해 공유


__clrcall

Microsoft 전용

지정 하는 함수에서 관리 되는 코드 에서만 호출할 수 있습니다.사용 __clrcall 만 관리 되는 코드에서 호출 되는 모든 가상 함수에 대해.그러나 네이티브 코드에서 호출 되는 함수에 대 한이 호출 규칙을 사용할 수 없습니다.

사용 __clrcall 가상 관리 되지 않는 함수를 관리 되지 않는 함수에서 관리 되지 않는 함수 포인터를 통해 관리 되는 함수를 호출할 때 성능 향상을 위해.

진입점은 별도 컴파일러가 생성 하는 함수입니다.모두 네이티브 및 관리 되는 진입점 함수가 있는 경우 그 중 하나를 실제 함수 함수 구현이 사용 됩니다.다른 함수는 실제 함수를 호출 하 고 공용 언어 런타임에서 Pinvoke를 수행 수 있습니다 별도 함수 (썽크) 됩니다.함수로 표시 하는 경우 __clrcall, 함수 구현이 MSIL 있어야 하 고 네이티브 진입점 함수를 생성 하지 않도록 지정 합니다.

경우 주소는 네이티브 함수를 찍을 때 __clrcall 지정 하지 않으면 컴파일러는 네이티브 진입점을 사용 합니다.__clrcall전환 거칠 필요가 원시 형식으로 관리 되는 함수에서 관리 되는 나타냅니다.경우 컴파일러는 관리 되는 진입점을 사용합니다.

/clr (없습니다 /clr:pure 또는 /clr:safe) 사용 및 __clrcall 입니다 미사용, 함수의 주소를 항상 주소 네이티브 진입점 함수를 반환 합니다.때 __clrcall 되지 않습니다는 진입점 썽크 함수 관리 되는 함수의 주소를 가져올 수 사용 하면 네이티브 진입점 함수를 만들어지지 않습니다.자세한 내용은 이중 썽킹(C++)를 참조하십시오.

/clr(공용 언어 런타임 컴파일)모든 함수 및 함수 포인터는 의미 __clrcall 및 함수 내부의 아무 것도 이외의 표시 되어야 하는 컴파일 컴파일러 허용 하지 __clrcall.때 /clr:pure 사용 하는 __clrcall 함수 포인터 및 외부 선언에만 지정할 수 있습니다.

사용자가 직접 호출할 수 있는 __clrcall 함수를 사용 하 여 컴파일된 기존 C++ 코드에서 /clr 함수가 MSIL 구현이 됨.__clrcall함수 해당 함수 함께 컴파일되는 경우에 인라인 asm 및 CPU 관련 intrinisics, 예를 들어, 호출 하는 함수를 직접 호출할 수 없습니다 /clr.

__clrcall함수 포인터는 만든 응용 프로그램 도메인에서 사용할 수만 위한 것입니다.전달 하는 대신 __clrcall 응용 프로그램 도메인에서 함수 포인터, 사용 CrossAppDomainDelegate.자세한 내용은 응용 프로그램 도메인 및 Visual C++를 참조하십시오.

예제

// clrcall.cpp
// compile with: /clr:oldSyntax /LD
void __clrcall Test1( ) {}
void (__clrcall *fpTest1)( ) = &Test1;

함수를 선언 하면 __clrcall, 코드 생성 됩니다 필요할 때. 예를 들어 때 함수가 호출 됩니다.

// clrcall2.cpp
// compile with: /clr
using namespace System;
int __clrcall Func1() {
   Console::WriteLine("in Func1");
   return 0;
}

// Func1 hasn't been used at this point (code has not been generated), 
// so runtime returns the adddress of a stub to the function
int (__clrcall *pf)() = &Func1;

// code calls the function, code generated at difference address
int i = pf();   // comment this line and comparison will pass

int main() {
   if (&Func1 == pf)
      Console::WriteLine("&Func1 == pf, comparison succeeds");
   else 
      Console::WriteLine("&Func1 != pf, comparison fails");

   // even though comparison fails, stub and function call are correct
   pf();
   Func1();
}
  

함수 포인터에서 관리 되는 코드 에서만 호출할 수 있습니다 선언 되도록 다음 샘플에서는 함수 포인터를 정의할 수 있습니다 보여 줍니다.이렇게 컴파일러가 관리 되는 함수를 직접 호출 하 고 네이티브 진입점 (double 썽크 문제)을 방지할 수 있습니다.

// clrcall3.cpp
// compile with: /clr
void Test() {
   System::Console::WriteLine("in Test");
}

int main() {
   void (*pTest)() = &Test;
   (*pTest)();

   void (__clrcall *pTest2)() = &Test;
   (*pTest2)();
}

참고 항목

참조

인수를 전달 하 고 명명 규칙

C + + 키워드