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 코드를 연결하고자 할 때마다 이 키워드를 사용해야 합니다.