extern "C" 질문

rebirth의 이미지

안녕하세요.
C 소스를 보다보면 extern "C"라는 걸 많이 쓰는데요..

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}

책을 찾아봐도 정확한 의미를 잘 모르겠네요.
대충 C와 C++간에 stack frame을 처리하는 차이때문이라던데
(음.. 맞나요? -_-a)
주로 C로 작성할때 위와 같이 많이 사용하는건가요?
아시는분 알려주세요~ 감사합니다 ^^

버그소년의 이미지

extern "C"는 C++컴파일러가 C로 컴파일된 오브젝트파일을

링크할때 사용됩니다. (링커라구해야하나?)

이유는 C와 C++가 오브젝트 파일을 생성할때 다르게 생성하기때문입니다.

C는 오브젝트 내에 함수 원형을 그대로 포함하고 있고,

C++은 그렇지 않습니다. 컴파일러 버전에 따라 다르게 함수이름을

변경합니다.

C++은 오버라이딩과같이 같은이름의 함수가 존재하기 때문에

매개변수등이나 기타 다른 것을 참조하여 함수명을 변경합니다.

네임 맹글링(name mangling) 이라고 하던데..

그렇기때문에 C++컴파일러는 C로 컴파일된 오브젝트를 링크할때

네임 맹글링된 함수를 찾지않고 함수 원형을 찾게 해야하는거죠..

그럼이만... 도움이 되셨길..

가끔은 밥을 굶어도 살 수 있다.

eyefree의 이미지

C++컴파일러가 수행하는

이름분해(name mangling)에 대해서 몇마디 적어보겠습니다. ^^;;

링커에서는 함수마다 다른 이름이 필요하게 되는데요.

C의 경우 원칙적으로 함수의 이름이 같은 것이 허용되지 않기 때문에

C컴파일러가 수행하는 이름 분해는

spiff(double, double) ==> _spiff

형태로 변환될 수 있습니다.

그런데...

C++의 경우 함수 오버로딩 등을 통해서 같은 이름을 가진 함수가

존재하게 되죠. 즉 언어의 연결에서 인자 리스트에 대한 고려도 이루어지게

되므로, C언어 연결과 다르게 되죠.

함수 오버로딩의 경우 함수 이름은 같고, 인자 리스트의 차별을 통해서

구분하게 되는데요.

spiff(double, double)

spiff(int)

이렇게 함수가 2개가 있다면, 이름분해(name mangling)과정을 통해

spiff(double, double) ==> _spiff_d_d

spiff(int) ==> _spiff_i

의 형태로 변환하는 것을 C++ 언어 연결이라고 합니다.

그런데 C++이전에 C로 개발된 함수들(목적코드 형태)을 C++에서 쓰고자

할때는 링커에서는 C++ 형태의 이름을 요구하지만, C언어 형태의 이름이

이미 들어있죠. 그래서 문제가 됩니다.

(소스코드를 구할 수 있다면 전혀 문제될 것이 없겠죠. ^^)

그럴 경우에

extern "C" 키워드를 함수의 선언문 앞에 붙여주면 링커가 C언어 연결을 이용

해서 사용하게 됩니다.

extern "C" void spiff(void)

이런 코드가 있다면, 목적 코드 형태의 spiff함수(C언어 컴파일러로 컴파일된..)

를 C++코드에서 사용하겠다는 의미가 되는 것이죠. ^^

... Do It Now!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.