728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

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