language_linkage — 언어 연결

language_linkage — 언어 연결 (Language linkage)

**언어 연결(language linkage)**은 서로 다른 프로그래밍 언어로 작성된 프로그램 단위 사이의 연결(linkage)을 제공해요.

예를 들어 C++ 함수를 C 프로그램에서 호출할 수 있게 하거나, C 함수를 C++에서 호출할 수 있게 할 때 사용해요. 가장 흔한 용도는 extern "C"예요.

출처: cppreference

본문

문법 (Syntax)

extern string-literal { declaration-seq }   // (1) 블록 형태
extern string-literal declaration            // (2) 단일 선언
  • (1) declaration-seq에 선언된 모든 함수 타입, 외부 연결을 가진 함수 이름, 외부 연결을 가진 변수에 언어 지정자 string-literal을 적용
  • (2) 단일 선언 또는 정의에 언어 지정자를 적용

string-literal은 평가되지 않는 문자열(un-evaluated string)로, "C" 또는 "C++"가 표준으로 지원돼요. 구현에 따라 추가 언어를 지원할 수 있어요.

extern "C" {
    int printf(const char*, ...);   // C 표준 라이브러리 함수 선언
    double sqrt(double);
}

extern "C" int my_c_function(int x);   // 단일 선언

C++20부터, 언어 연결은 선언을 그 모듈에서 분리(detach)하는 데도 사용될 수 있어요 (모듈 소유권 참조).

// C로 작성된 함수를 C++에서 호출
extern "C" void c_function(int);
// C++ 함수를 C로 노출
extern "C" int cpp_entry(int n) { return n * 2; }

중요한 특징은 다음과 같아요.

  • 언어 연결은 함수 타입과 함수 이름에 적용돼요. C와 C++은 이름 장식(name mangling)이 달라서, extern "C"는 이름 장식 없이(즉 C 규칙으로) 심볼을 노출해요.
  • 같은 이름의 C 링크 함수와 C++ 링크 함수는 별개의 함수로 취급돼요 (오버로드 가능).
  • extern "C" 블록은 여러 선언을 묶을 때 자주 쓰여요.

이 기능은 C 라이브러리를 C++ 프로젝트에서 사용하는 데 핵심적이에요. <cstdio>, <cmath> 같은 표준 헤더가 한동안 C와의 호환을 extern "C"로 제공해왔어요.

더 알아보기 (Learn more)

cppreference