C++에서 C 파일을 컴파일 하려면, 해당 C 파일이 포함된 헤더 파일에 extern "C" 를 선언해주어야 합니다.
이렇게 하면 C++ 컴파일러는 해당 헤더 파일에 있는 함수 및 변수들을 C 스타일로 링크하게 됩니다.
만약 C 파일 자체를 컴파일 하기 위해서는, 해당 C 파일 내에도 extern "C" 를 선언해주어야 합니다.
이렇게 하면 C++ 컴파일러는 해당 C 파일을 C 스타일로 컴파일하게 됩니다.
예를 들어, 아래와 같은 C 파일과 헤더 파일이 있다고 가정해보겠습니다.
< sample.c 파일 >
#include "sample.h"
int add(int a, int b) {
return a + b;
}
< sample.h 파일 >
#ifndef SAMPLE_H
#define SAMPLE_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // SAMPLE_H
위의 예제에서 sample.h 파일에서 extern "C" 선언을 사용하여 add 함수가 C 스타일로 링크되도록 설정하였습니다.
이제 이 헤더 파일을 C++ 파일에서 include 하여 사용하면 됩니다.
#include "sample.h"
int main() {
int result = add(1, 2);
return 0;
}
sample.c 파일에서 extern "C"를 선언하지 않아도 되는 이유는, C 파일 자체가 C 스타일로 작성되어 있기 때문입니다.
C 파일은 C++과는 달리 *name mangling 을 하지 않으므로, extern "C" 선언이 필요하지 않습니다.
반면에, C++ 파일에서는 함수나 변수 이름 맹글링이 발생할 수 있으므로, C++ 파일에서 C 함수를 호출하거나 C 변수를 사용할 때는 extern "C" 선언을 해주어야 합니다.
따라서, C++에서 C 함수 또는 변수를 사용할 때는 해당 C 함수 또는 변수가 선언된 헤더 파일에 extern "C" 선언을 추가해주어야 합니다. 그러나 C 파일에서는 해당 선언을 할 필요가 없습니다.
name mangling 이란?
함수 및 클래스 이름과 같은 식별자(identifier)를 컴파일러가 처리하기 쉬운 내부 표현 형식으로 변환하는 과정을 말합니다.
이는 C++의 오버로딩(overloading) 및 네임스페이스(namespaces)와 같은 기능을 지원하기 위해 필요합니다.
C++ 컴파일러는 linker 가 사용하는 symbol 테이블을 생성하는데, 이 기호 테이블에는 함수와 클래스 이름 및 다른 식별자에 대한 정보가 포함됩니다. 이 정보를 사용하여 링커는 프로그램의 다른 부분에서 해당 함수 또는 클래스를 사용할 수 있습니다.
그러나 C++에서 함수 및 클래스 이름은 여러 매개변수를 가질 수 있습니다.
이를테면, add(int a, int b)와 add(double a, double b)는 동일한 이름의 함수일지라도 서로 다른 매개변수 유형을 가지므로 서로 다른 기호(symbol)로 링크되어야 합니다. 이때, 컴파일러는 이러한 함수 및 클래스 이름을 링커에서 사용할 수 있는 고유한 기호로 변환하기 위해 name mangling을 수행합니다.
즉, Name mangling은 컴파일러에 따라 다를 수 있지만, 일반적으로 함수 및 클래스 이름에 유일한 식별자를 추가하여 고유한 이름을 만듭니다. 이 식별자는 함수의 매개변수 유형 및 반환 유형과 같은 정보를 포함합니다.
예를 들어, add(int, int) 함수의 이름은 _Z3addii와 같은 형식으로 변환될 수 있습니다.
Name mangling은 일반적으로 개발자가 직접적으로 관여하지 않지만, 링커 오류를 해결하거나 디버깅하는 과정에서 체크해야 할 수도 있습니다.
'C++ > syntax' 카테고리의 다른 글
변환 생성자(conversion constructor)의 활용 (0) | 2023.04.10 |
---|---|
[C++] std::fstream 의 역할과 작동원리 (0) | 2023.04.01 |
버퍼(buffer)와 표준입력 스트림(stream) 그리고 getch 와 getchar (0) | 2023.03.30 |
const char* 와 string class (0) | 2023.03.30 |
[C++] shared_ptr 사용시 주의할 점 (0) | 2023.03.27 |