728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
C 언어의 역사가 오래된 만큼 C 언어로 작성된 많은 라이브러리와 소스 코드가 존재하며, 현재도 C 언어는 여러 분야에서 활발히 사용되고 있다. 따라서, C++ 프로그램에서 C 코드를 연결하여 사용하는 방법을 알아두는 것이 많은 도움이 될 것이다.
C/C++ 컴파일러의 이름 규칙
- 모든 컴파일러는 소스 코드를 컴파일하여 목적 코드(obj 파일)를 만들 때, 소스 코드에 있는 변수, 함수, 클래스의 이름을 변형하여 저장하며, 이를 흔히 이름 규칙(naming mangling)이라고 부른다.
- C / C++ 컴파일러는 서로 다른 이름 규칙을 가지고 있기에 지금부터 알아보자.
C 컴파일러의 이름 규칙
- C 컴파일러는 함수 이름 앞에 밑줄표시문자(' _ ')를 붙인다.
- 매개 변수의 존재나 리턴 타입은 전혀 반영하지 않는다.
_f
_main
C 언어에서 함수 중복이 불가능한 이유
- C 언어에서 함수 중복이 불가능한 이유는 바로 C 컴파일러의 이름 규칙의 한계 때문
- int f(int x)나 int f(int x, int y) 함수 모두 매개 변수의 존재 여부와 관계없이 _f라는 이름으로 컴파일 되기 때문이다.
C++ 컴파일러의 이름 규칙
- C++ 컴파일러는 목적 코드를 만들 때 함수의 매개 변수 타입, 리턴 타입 등을 참조하여 복잡한 기호를 포함하는 이름을 붙인다.
- 이렇게 함으로써 중복 함수(overloaded function)들이 목적 파일 내에서 구분된다.
int f(int x, int y)
int f(int x)
int f()
int main()
// 위의 함수를 순서대로 나타내었음
?f@@YAHHH@Z
?f@@YAXH@Z
?f@@YAHXZ
_main
C++ 프로그램에서 C 함수 호출시 링크 오류가 발생하는 경우
- C와 C++ 컴파일러 사이의 이름 규칙이 서로 다르기 때문에 C 언어로 작성된 함수를 C++ 프로그램에서 그냥 호출하면 링크 오류가 발생한다.
- main.ojb와 f.ojb를 링크할 때, 링커는 main.oboj에서 호출하는 ?f@@YAHHH@Z 이름의 함수를 f.ojb에서 발견할 수 없기 때문에 링크 오류를 발생시킨다.
이름 규칙의 표준
- 이름 규칙(naming mangling)에는 표준이 없다.
- 컴파일러마다 목적 코드에 함수의 이름을 붙이는 방법이 서로 다르기 때문에, 서로 다른 컴파일러로 컴파일된 목적 파일들은 링크되지 않는다.
정상적인 링킹, extern "C"
- 위에서의 링크 오류를 수정해보자.
- C++ 컴파일러에게 main.cpp안의 f()가 C 언어로 작성된 것임을 알려주어, f() 이름에 대해서만 C 언어의 이름 규칙으로 컴파일되게 하면 된다.
extern "C" int f(int x, int y);
// 묶어서 선언해도 됨
extern "C" {
void g();
char s(int []);
}
// 또는 헤더 파일을 통째로 지정할 수 있음
extern "C" {
#include "myfunction.h"
}
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] 예외 처리 (1) | 2023.12.27 |
---|---|
[C++] 사용자 조작자 만들기 (1) | 2023.12.21 |
[C++] 삽입 연산자(<<)와 추출 연산자(>>) (0) | 2023.12.21 |
[C++] 포맷 (1) | 2023.12.21 |
[C++] ostream과 istream (1) | 2023.12.20 |