개요
C++로 DLL을 익스포트하여 유니티에서 사용하려고 할때 C++안의 함수에 extern "C" __declspec(dllexport)를 붙입니다.
참 기괴하게 생겼는데 어찌보면 C++답게 생겼습니다.
오늘은 얘네들이 뭐하는 놈인지를 살펴보죠.
extern "C"
딴거 다 제쳐두고 뜻만 알아보자면 extern "C"는 코드를 C언어 스타일로 내보내라는 뜻입니다.
...너무 막연하죠?
당연하게도 뭔소린지 모르겠습니다. C++도 해보다보면 사실 C언어 확장판이라 대체 C언어 스타일이 뭘까 고민하게됩니다.
조금 더 깊이 들어가자면 extern "C"는 name mangling을 하지 말라는 뜻입니다.
name mangling
이 extern "C" 키워드를 이해하기 위해선 먼저 C++의 name mangling을 이해해야 합니다.
그리고 이 name mangling을 이해하기 위해선 먼저 함수 오버로딩에 대해 알아야하죠.
함수 오버로딩이란 개발자가 똑같은 이름의 함수가 다른 기능을 수행하도록 만들 수 있는 기능을 말합니다.
간단하게 예제를 보자면...
int add(int a, int b) { return a + b; }
string add(string a, string b) { return a + b; }
float add(float a, float b) { return a + b; }
이런 식으로 모두 add라는 이름의 함수지만 정수, 문자열, 실수를 각각 더하여 반환하는 다른 기능의 함수입니다.
하지만 유의할 점은 반환형의 차이는 호출되는 함수를 구분하는 기준점이 되지 못하기 때문에 무조건 매개변수가 달라야 한다는 점이죠.
각설하고, 이 함수 오버로딩이 작동하기 위해선 name mangling이 필수적인데 그 이유는 똑같은 이름의 함수를 구별하기 위해서입니다.
그래서 name mangling이 무엇이냐 하면 바로 C++의 컴파일러가 각 함수마다 특정한 심볼을 더해서 새로이 작명하는 것을 말합니다.
간단하게 저 위에 코드블록을 첫째줄에 있는 add 함수는 int자료형 + int자료형이니 addii로 다시 작명하는 것이죠.
이때 붙이는 심볼은 매개변수에 따라 달라지기 때문에 오버로딩 되는 함수의 반환형만 다르다고 구분할 수 없는 것입니다.
물론 심볼이 저렇게 간단하지도 않고 컴파일러에 종류에 따라서 또 달라집니다만 솔직히 이건 알아봤자 딱히 도움이 되지는 않습니다.
자, 여기선 C 얘기도 해야하는데요. C언어라곤 프로그래밍 시작할때 1주 남짓 했던게 전부라 지식 수준이 얕다못해 거의 없다싶이 하기 때문에 조심스럽게 얘기해보자면 일단 C언어엔 함수 오버로딩이라는 개념이 존재하지 않습니다.
하나의 프로그램에 같은 이름의 함수가 존재할 수 없다는 뜻이죠.
그러다보니 C++로 작성된 코드를 C에서도 사용하고싶다면 extern "C" 키워드를 통해 함수의 name mangling을 막아야합니다.
왜냐하면 C++은 name mangling된 함수를 찾아가는데 C는 별도의 심볼이 붙지않은, name namgling 되지 않은 함수를 찾으려하거든요.
그래서 결론이 무엇이냐 하면 extern "C"를 붙이면 C++ 컴파일러는 name mangling을 하지 않는다는 뜻입니다.
그래서 C++로 적은 코드를 C에서 사용하고 싶을때 많이 사용합니다만 저는 C#에서 사용하기 위해 사용합니다.
C#도 name mangling된 함수를 찾아오진 못하거든요.
__declspec(dllexport)
얘는 간단하게 public 과 비슷하다고 보면 됩니다.
이 키워드가 붙은 함수는 dll을 임포트 한 곳에서 호출할 수 있게 되고 안붙는다면 dll 내부에서만 사용하게 됩니다.
진짜 별거 없죠? 근데 진짜 기괴하게 생겼어요. 늘 생각하는데 언더바 두개는 대체 누구 머리에서 나온 문법일까요?
마치는 말
C++로 적은 코드를 유니티에 dll로 임포트 할 일이 생겨서 적어본 글입니다.
요즘 글을 참 안쓰고 있는데 단순히 쓸게 없는게 아니라 쓰기 좀 귀찮아요.
최근 프로젝트를 2개 시작하며 개발일지가 올라가긴 할겁니다.
'개발 > C++' 카테고리의 다른 글
게임 프로그래밍 | C++ | 헤더 (0) | 2024.05.23 |
---|---|
게임 프로그래밍 | C++ | 빌드 (1) | 2024.04.29 |
자료구조 | C++ | 연산자 오버로딩 (Overload) (1) | 2024.04.23 |
C++ | 동적 배열 (3) | 2024.04.17 |
게임 프로그래밍 | C++ | 메모리 구조 (0) | 2024.04.17 |