Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 extern "C"의 효과는 무엇입니까?

<시간/>

extern "C" 키워드는 C++의 함수 이름에 C 연결을 갖도록 만드는 데 사용됩니다. 이 경우 컴파일러는 함수를 맹글링하지 않습니다. 먼저 C++에서 맹글링이 무엇인지 살펴보고 extern "C" 키워드에 대해 논의할 수 있습니다.

C++에서는 함수 오버로딩 기능을 사용할 수 있습니다. 이 기능을 사용하여 같은 이름의 함수를 만들 수 있습니다. 유일한 차이점은 인수 유형과 인수 수입니다. 반환 유형은 여기에서 고려되지 않습니다. 이제 문제는 C++가 개체 코드에서 오버로드된 함수를 구별하는 방법입니다.

개체 코드에서 인수에 대한 정보를 추가하여 이름을 변경합니다. 여기에 적용된 기술을 Name Mangling이라고 합니다. C++에는 이름 맹글링에 대한 표준화된 기술이 없습니다. 따라서 컴파일러마다 다른 기술을 사용합니다.

다음은 이름 맹글링의 예입니다. 오버로드된 함수의 이름은 func()이고 다른 함수 my_function()이 있습니다.

예시

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++ 컴파일러는 아래와 같이 변경합니다 -

예시

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++ 코드는 오류를 생성합니다.

예시

int printf(const char *format,...);
main() {
   printf("Hello World");
}

출력

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

이 문제는 printf()의 이름이 컴파일러에 의해 변경되었기 때문에 발생합니다. 그리고 업데이트된 printf() 함수의 정의를 찾지 못합니다. 이 문제를 극복하려면 C++에서 extern "C"를 사용해야 합니다. 이 블록 내에서 일부 코드가 사용되면 C++ 컴파일러는 함수 이름이 맹글링되지 않도록 합니다. 따라서 이름은 변경되지 않습니다. 따라서 위의 코드는 이 문제를 해결하기 위한 것입니다.

예시

extern "C"{
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

출력

Hello World

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

따라서 extern "C"는 기본적으로 하나의 연결 사양입니다. 모든 컴파일러에서 이 키워드를 사용하여 C 연결을 지정해야 합니다. 그리고 연결 사양이 네임스페이스 범위에 있어야 한다는 점을 명심해야 합니다. 클래스 멤버는 extern "C"에서 무시됩니다.