다음을 통해 공유


링크 사양

"링크 사양"은 다른 언어로 작성된 함수(또는 프로시저)를 링크하기 위한 프로토콜을 의미합니다. 다음 호출 규칙이 영향을 받습니다.

  • 이름의 대/소문자 구분

  • 이름의 데코레이션 C에서 컴파일러는 이름 앞에 밑줄을 붙입니다. 이를 대개 "데코레이션"이라고 합니다. C++에서 이름 데코레이션은 링크 단계를 통해 형식 정보를 유지하는 데 사용됩니다. 데코레이팅된 이름을 참조하십시오.

  • 스택에서 인수의 예상 순서

  • 함수 반환 시 스택을 조정할 책임. 호출된 함수나 호출하는 함수가 담당합니다.

  • 숨겨진 인수의 전달(숨겨진 인수가 전달되는지 여부)

extern string-literal { declaration-list }
extern string-literal declaration

링크 사양은 기존 코드의 사용을 허용함으로써 C 코드를 C++로 점차적으로 이식하는 과정을 용이하게 합니다.

Microsoft 전용

현재 Microsoft C++에서 지원되는 유일한 링크 사양은 "C" 및 **"C++"**입니다.

Microsoft 전용 종료

다음 예제에서는 C 링크를 사용하여 atoi 및 atol 함수를 선언합니다.

extern "C"
{
    int  atoi( char *string );
    long atol( char *string );
}

이러한 함수는 C 링크를 사용하여 호출합니다. 다음과 같은 두 선언으로 동일한 결과를 얻을 수 있습니다.

extern "C" int  atoi( char *string );
extern "C" long atol( char *string );

Microsoft 전용

모든 Microsoft C 표준 포함 파일에서는 C++ 컴파일을 감지하기 위한 조건부 컴파일 지시문을 사용합니다. C++ 컴파일이 감지되는 경우 다음과 같이 프로토타입이 extern "C" 지시문으로 묶여 있습니다.

// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif

// Function declarations

#if defined(__cplusplus)
}
#endif 

Microsoft 전용 종료

표준 포함 파일에서 함수를 **extern "C"**로 선언할 필요는 없습니다.

함수가 오버로드된 경우 이름이 같은 함수 중 하나에만 링크 지정자가 포함될 수 있습니다. 자세한 내용은 함수 오버로드를 참조하십시오.

다음 표에서는 다양한 링크 사양이 어떻게 작용하는지를 보여 줍니다.

링크 사양의 효과

사양

효과

개체

해당 개체의 링크에만 영향을 줍니다.

함수

해당 함수 및 그 안에서 선언된 모든 함수나 개체의 링크에 영향을 줍니다.

클래스

클래스 내에서 선언된 모든 비멤버 함수 및 개체의 링크에 영향을 줍니다.

함수에 둘 이상의 링크 사양이 있는 경우 두 사양은 일치해야 합니다. C 및 C++ 링크가 둘 다 있는 것으로 함수를 선언하면 오류가 발생합니다. 뿐만 아니라 함수에 대한 두 선언(링크 사양이 있는 선언과 없는 선언)이 프로그램에서 발생할 경우 링크 사양이 있는 선언이 첫 번째여야 합니다. 이미 링크 사양이 있는 함수의 모든 중복 선언에는 첫 번째 선언에서 지정된 링크가 제공됩니다. 예를 들면 다음과 같습니다.

extern "C" int CFunc1();
...
int CFunc1();            // Redeclaration is benign; C linkage is
                         //  retained.

int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
                         //  CFunc2;  cannot contain linkage
                         //  specifier.

복합 링크 지정자({ })의 본문 내에서 static으로 명시적으로 선언된 함수와 개체는 정적 함수 또는 개체로 취급되며 링크 지정자는 무시됩니다. 다른 함수와 개체는 extern 키워드를 사용하여 선언된 것처럼 동작합니다. extern 키워드에 대한 자세한 내용은 extern을 사용하여 링크 지정을 참조하십시오.

참고 항목

참조

extern을 사용하여 링크 지정