C++에서 extern C 사용

Mehvish Ashiq 2023년10월12일
C++에서 extern C 사용

이 자습서에서는 C++에서 extern "C"의 영향을 이해하기 위한 전제 조건인 C++의 이름 맹글링에 대해 설명합니다. 또한 C++ 프로그래밍에서 extern "C"에 대해 교육합니다.

C++에서 extern "C" 사용

extern 키워드를 사용하여 외부 변수라고도 하는 전역 변수를 정의하고 메서드(함수) 외부에서 정의합니다. 프로그램 전체에서 이러한 변수를 사용하고 함수를 사용하여 값을 수정할 수 있습니다.

C++ 파일에서 extern 키워드가 사용되면 C++의 특정 함수 이름에 C 연결이 있습니다. 이 상황에서 컴파일러는 함수 이름을 변경하지 않습니다.

C++ 프로그래밍에서 이름 맹글링이란 무엇입니까?

C++에서 extern 키워드를 이해하기 위한 전제 조건입니다. 그럼 먼저 이름 맹글링에 대해 알아봅시다.

C++ 프로그래밍은 함수 오버로딩 기능을 지원합니다. 이름은 같지만 인수의 수와 데이터 유형이 다른 여러 함수를 가질 수 있습니다.

여기서 return 데이터 유형은 고려되지 않습니다. 문제는 오버로드된 함수가 개체 코드에서 어떻게 구별되는지입니다.

함수 이름은 각 인수에 대한 세부 정보를 추가하여 개체 코드에서 변경됩니다. 여기에서 인수 정보를 추가하는 데 사용되는 기술은 이름 맹글링입니다.

C++ 프로그래밍에는 이름 맹글링을 위한 표준화된 기술이 없다는 점을 기억하십시오. 이것이 다양한 컴파일러가 다양한 기술을 사용하는 이유입니다.

다음은 C++ 프로그래밍에서 이름 맹글링의 실제 데모입니다. 아래 코드에는 계산이라는 오버로드된 함수 3개와 메인 메서드 1개가 있습니다.

예제 코드:

int calculate(int number) { return number * number; }
double calculate(double number) { return number * number; }
float calculate(float number) { return number * number; }
int main(void) {
  int number1 = calculate(3);
  double number2 = calculate(3.38);
  float number3 = calculate(3.00);
}

C++ 컴파일러는 위의 코드를 변경하여 오버로드된 함수를 구분합니다.

예제 코드:

int __calculate_i(int number) { return number * number; }
double __calculate_d(double number) { return number * number; }
float __calculate_f(float number) { return number * number; }

int __main_v(void) {
  int number1 = __calculate_i(3);
  double number2 = __calculate_d(3.38);
  float number3 = __calculate_f(3.00);
}

C 프로그래밍은 함수 오버로딩을 지원하지 않습니다. 따라서 C 코드를 C++ 파일에 연결할 때 함수 이름이 변경되지 않도록 해야 합니다.

아래 코드 스니펫은 컴파일러가 printf() 함수의 이름을 변경하고 변경/업데이트된 printf() 함수의 정의를 찾을 수 없기 때문에 오류를 생성합니다.

예제 코드:

int printf(const char *format, ...);
int main() { printf("I'm learning the use of Extern in C++"); }

이 문제를 해결하기 위해 C++ 프로그래밍에서 extern 키워드를 사용합니다. C++ 컴파일러가 extern "C" {} 블록 내에서 코드를 찾을 때마다 함수 이름이 손상되지 않은 상태로 유지되는지 확인합니다.

이는 함수의 이름이 변경되지 않고 프로그램이 성공적으로 실행될 수 있음을 의미합니다. 다른 컴파일러는 이러한 코드 블록에 대해 다른 출력을 생성할 수 있습니다.

예제 코드:

extern "C" {
int printf(const char *format, ...);
}
int main() { printf("I'm learning the use of Extern in C++"); }

출력:

I'm learning the use of Extern in C++

따라서 extern "C"네임스페이스 범위 내에 있어야 하는 연결 사양입니다. extern "C"는 클래스 구성원을 무시합니다.

C++ 파일에서 C 코드를 연결하고자 할 때마다 이 키워드를 사용해야 합니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook