> 백엔드 개발 > C++ > 본문

C++의 이름 혼동 및 extern 'C'

WBOY
풀어 주다: 2023-08-29 10:21:11
앞으로
1301명이 탐색했습니다.

名称混淆和extern "C"在C++中

C++에서는 함수 오버로딩 기능을 사용할 수 있습니다. 이 기능을 사용하면 동일한 이름을 가진 함수를 만들 수 있습니다. 유일한 차이점은 매개변수 유형과 매개변수 수입니다. 여기서는 반환 유형을 고려하지 않습니다. 이제 문제는 C++가 대상 코드에서 오버로드된 함수를 어떻게 구별하는가입니다.

타겟 코드에서는 매개변수에 대한 정보를 추가하여 이름을 변경합니다. 여기에 적용된 기술을 이름 맹글링(name mangling)이라고 합니다. C++에는 표준화된 이름 변경 기술이 없습니다. 따라서 서로 다른 컴파일러는 서로 다른 기술을 사용합니다.

아래는 이름 맹글링의 예입니다. 오버로드된 함수의 이름은 func()이며, 또 다른 함수 my_function()이 있습니다.

Example

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}
로그인 후 복사

일부 C++ 컴파일러에서는 아래와 같이 변경됩니다. -

Example

int __func_i(int x) {
   return x*x;
}
double __func_d(double x) {
   return x*x;
}
void __my_function_v(void) {
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}
로그인 후 복사

C는 함수 오버로딩을 지원하지 않으므로 C++에서 C 코드를 링크할 때 기호 이름이 변화 . 다음 C++ 코드는 오류를 생성합니다.

Example

int printf(const char *format,...);
main() {
   printf("Hello World");
}
로그인 후 복사

Output

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status
로그인 후 복사

문제는 컴파일러가 printf()의 이름을 변경했기 때문에 발생합니다. 그리고 printf() 함수의 업데이트된 정의를 찾지 못합니다. 이 문제를 해결하려면 C++에서 extern "C"를 사용해야 합니다. C++ 컴파일러는 이 블록 내에서 일부 코드가 사용될 때 함수 이름이 손상되지 않도록 보장합니다. 그러면 이름이 바뀌지 않습니다. 따라서 위의 코드는 이 문제를 해결하기 위해 다음과 같이 보일 것입니다.

Example

extern "C" {
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}
로그인 후 복사

Output

Hello World
로그인 후 복사

참고: 이 코드 블록은 다른 컴파일러에서 다른 결과를 생성할 수 있습니다.

위 내용은 C++의 이름 혼동 및 extern 'C'의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿