고수들이 절대 가르쳐 주지 않는 C/C++ 프로그래밍 팁 #2 A/S - C/C++ Mixed Programming

Posted at 2007. 6. 19. 00:35 // in S/W개발/고절가주팁 // by 김윤수


생각해 봤더니 저번에 두번째 팁을 쓰면서 한 가지 빠진 사항이 있어서 이렇게 A/S 글을 덧붙입니다.

제가 마지막에 정리하길...

C 라이브러리를 작성하려거든 나중에 C++ 에서 활용될 가능성을 미리 염두해 두고, 헤더 파일 처음과 마지막에 extern "C" {} 가 조건부 컴파일되게 하시라

라고 했던 것 기억하시죠 ? 근데 솔직히 세상이 우리 생각대로만 돌아간다면 얼마나 좋겠습니까 ? 다들 제가 말한 팁을 알고 있다면 처음 작성할 때부터 C++ 고려해서 프로그래밍했겠지만, 실제로는 그렇지 않은 경우가 더 많기 마련입니다.

지금 우리 수중에 C++를 고려하지 않은 괜찮은 C 라이브러리가 있는데, 이걸 C++ 에서 쓰고 싶을 경우는 어떻게 해야할까요 ? 그 C 라이브러리의 헤더 파일을 편집해서 함수 선언에다가 일일이 extern "C"를 붙여댈까요 ? 그렇게라도 해서 그 C 라이브러리를 쓰시겠다면 말리진 않겠지만, 머리가 똑바로 박힌 사람이라면 한 열개쯤 extern "C" 를 붙이다가 이걸 어떻게 쉽게 해결할 방법이 없을까 하고 고민하기 시작할 겁니다. 이른바 창조적인 귀차니즘이 시작되는 거죠. 이런 창조적인 귀차니즘은 매우 바람직한 현상이니, 개발하는 동안에는 반복적인 작업을 얼마든지 귀찮아 하시기 바랍니다.

저번 글에서 extern "C" { ... } 이런식으로 { ... } 내용 전체에 대해 extern "C"를 붙이는 방법이 있다는 걸 소개해 드렸습니다. 이걸 한 번 더 응용하시면 됩니다. 다음 C 라이브러리가 C++ 를 고려하지 않고 다음과 같이 작성되어 있다고 치겠습니다.

  1. /* max.h */
  2. int max(int a, int b);

그럼 이걸 include 하는 C++ 소스 코드에서는 다음과 같이 하시면 됩니다.

  1. /* cppmain.cpp */
  2. #include <iostream>
  3. extern "C" {
  4. #include "max.h"
  5. }
  6. using namespace std;
  7. // 나머지 내용은 동일

컴파일 해 보시면 컴파일/링크도 잘 되고 예상대로 실행도 잘되는 걸 확인하실 수 있을 겁니다. 이번글은 두 번째 팁의 A/S 글이니 여기에서 짧게 마칩니다.


이 글은 스프링노트에서 작성되었습니다.

제 글이 유익하셨다면 오른쪽 버튼을 눌러 제 블로그를 구독하세요. ->
블로그를 구독하는 방법을 잘 모르시는 분은 2. RSS 활용을 클릭하세요.
RSS에 대해 잘 모르시는 분은 1. RSS란 무엇인가를 클릭하세요.