일반적으로 C 언어로 작성된 함수를 C++ 언어에서 불러 사용하려면
extern "C" 라는 키워드가 필요하다.
C 언어의 함수 정의를 ****.h 라는 헤더 파일에 기록해 두고
이 헤더 파일응 C++ 소스에서 포함(include)하려면 몇 가지 주의할 점이 있다.
우선 함수의 정의가 있는 C 소스와 C 언어용 헤더 파일을 보자.
[(구현) 파일명: sayHello.c] ------------------------------------
#include <stdio.h>
void print_message(char *message) {
printf("%s\n", message);
}
위는 print_message(char *) 라는 함수 하나만 달랑 구현되어 있는 C 소스 파일이다.
[(정의) 파일명: sayHello.h] ------------------------------------
#ifndef HELLO_H_INCLUDED
#define HELLO_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
void print_message(char *message);
#ifdef __cplusplus
} /* end of the 'extern "C"' block */
#endif
#endif // HELLO_H_INCLUDED
위는 함수 print_message(char *) 를 다른 C 또는 C++ 소스파일에서 불러 쓸 수 있도록
그 함수의 정의를 기헉힌 헤더 파일이다. exterb "C" { ....... } 라고 힐 경우
......... 부분이 C 언어 양식이고 이를 C++ 에서 인식할 수 있도록 하는 키워드가 extern "C" 이다.
그러나 헤더 파일에 이렇게만 적어 두면 C++ 소스에서는 불러 올 순,ㄴ 있지만, C 소스에서는
불러오지 못하는 문제사 생긴다. 이를 해경하기 위해 (즉, C 소스나 C++ 소스에서 이를 불러 쓰기 위해
추가한 것이 그 위와 아래에 적어 준
#ifdef __cplusplus
extern "C" {
#endif
...............................................
#ifdef __cplusplus
} /* end of the 'extern "C"' block */
#endif
부분이다.
그리고 이 헤더 파일의 시작과 끝 부분에 적어 준
#ifndef HELLO_H_INCLUDED
#define HELLO_H_INCLUDED
............................................
#endif // HELLO_H_INCLUDED
부분은 이 헤더 파일이 다른 소스에 포함(include)될 경우 단 한번 만 포함되게 하는 구문이다.
[파일명: hello.hpp] -------------------------------------
#ifndef HELLO_HPP_INCLUDED
#define HELLO_HPP_INCLUDED
#include "sayHello.h"
#endif // HELLO_HPP_INCLUDED
위는 C++ 소소에서 포함할 헤더 파일이다.
[파일명: callSayHello.cpp] -----------------------------------
// Filename: callSayHello.cpp
//
// Compile & Link: g++ -o callSayHello callSayHello.cpp sayHello.o
// Execute: ./callSayHello
// Output:
// Hello world!
// Hello world!
//
// Or
//
// Compile: cl /c sayHello.c
// Compile & Link: cl callSayHello.cpp sayHello.c /EHsc
// Execute: .\callSayHello
// Date: 2021.01.07
//
#include <iostream>
#include "hello.hpp"
using namespace std;
int main()
{
cout << "Hello world!" << endl;
// print_message ("Hello world!");
print_message ((char *)"Hello world!");
return 0;
}
위는 C 언어로 작성된 함수 print_message(char *) 를 불러 사용하는 C++ 소스의 내용이다.
참고로 27째 줄 // print_message ("Hello world!"); 의 주석문 표시 // 를 제거하면,
아래와 같은 컴파일 경고(warning)가 뜬다. 이 경고가 뜨더라도 컴파일되고 실행도 되지만,
그 아래 줄 처럼 (char *) 라는 캐스팅을 추가하면 경고 없이 컴파일도 잘 되고 실행도 잘 된다.
$ g++ -o callSayHello callSayHello.cpp sayHello.o
callSayHello.cpp: In function 'int main()':
callSayHello.cpp:27:20: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
27 | print_message ("Hello world!");
'프로그래밍 > C++' 카테고리의 다른 글
new 키워드로 생성된 배열의 크기 변경하여 재할당하기 (0) | 2021.02.24 |
---|---|
utf8 인코딩을 이용한 다국어 hello world (0) | 2021.01.23 |
cygwin 의 g++ 로 UTF-8 한글 처리하는 간단한 예제 (0) | 2014.04.13 |
cygwin 의 g++ 로 utf-8 문자열 거꾸로하기 (0) | 2014.04.10 |
cygwin/mingw 의 g++ 로 utf-8 한글 처리하기 (0) | 2014.04.10 |