inline함수와 매크로 함수의 차이 ?

똥꼬의 이미지

어떤 차이나 기준으로 구현시 각각을 사용할까여?

제가 일단 생각하기에는 리턴타입이 있을 경우에는 inline함수를 사용해야 할거 같거든요.

그 외에 구체적으로 두 함수를 구분지어 구현해야 하는 차이가 있을까여?

lsj0713의 이미지

일단은 inline 함수가 편리하긴 합니다. 매크로 함수는 한줄(비록 '\'로 연결할 수 있다 하더라도) 안에 다 써야 된다는 제한이 있고, 말씀하신 대로 리턴값을 넘겨야 할 때에도 컴파일러의 특성에 의존해야 합니다. 에러메시지도 inline 쪽이 더 이해하기 쉬운 쪽으로 나오겠죠.

하지만 inline의 구현 방식은 컴파일러에 따라 다릅니다. inline 키워드 자체는 단지 컴파일러에게 이 함수는 빈번히 호출된다는걸 알려주기 위한 힌트일 뿐입니다. 게다가 inline이 붙었다고 해서 항상 인라인 함수로 만들 필요도 업습니다. MSDN에서도 inline에 대해 찾아보면 inline이 쓰인 함수에 대해서 항상 인라인 함수로 만들 필요가 없다고 쓰여 있습니다(거기에 몇몇 경우가 나와 있습니다).

또한 inline 키워드는 C99에서 새로 추가된 키워드입니다. 그 전의 컴파일러라도 자기 자신만의 확장으로 inline을 지원할 수도 있겠습니다만... 어쨌거나 오래된 컴파일러라면 쓰지 못할 가능성도 있습니다.

결국 자신이 사용해야 될 컴파일러에서의 inline의 특성에 따라 결정할 일이겠죠.

corba의 이미지

단순한 call by value의 형태로 짤막한 함수를 만들 때에는 매크로 보다 인라인이 보기도 좋고 매크로의 잘못된 사용을 막을 수 있어 좋을 것 같습니다.

하지만 인라인도 잘못쓰면 프로그램 덩치를 키우게 되니 주의가 필요 하겠지요.

STL의 함수자 같은 경우 인라인으로 동작해 알고리즘과 결합시 일반 함수보다 더 나은 성능을 보여준다고 하더군요.

하지만 매크로의 사용을 인라인으로 다 대체 할 수는 없을 것 같습니다.

매크로에는 강력한 Stringizing Operator (#)과 Charizing Operator (#@), Token-Pasting Operator (##) 등이 있으니까요.

또, 매크로엔 조건부 컴파일 기능도 있죠.

whiterock의 이미지

매크로는 전처리기에서 처리를 하고, inline 함수는 컴파일시 처리를 하죠. 처리되는 시점이 틀리죠..

주된 차이점은 인라인 함수는 일반함수와 똑같이 사용을 하는거겠죠. 인자에 대한 검사도 할수 있고 리턴 값도 있고.
매크로는 컴파일 전에 치환을 해주는 거고요. 매크로 사용은 주의를 요하죠. 실수를 잘 못찾는 경우도 많죠..

흐음...

똥꼬의 이미지

모두들 답변감사합니다. ^^ 인라인함수와 매크로 함수가 gcc컴파일시에 전처리기에 의해서 같은 시점에 컴파일 되는 줄 알았는데.. 아니군요 ..

open source의 그날까지!

ng4you의 이미지

저도 처리되는 시점만 다르다고 알고 있습니다.

whiterock님께서 말씀하신것처럼 전처리기에서 매크로함수가 처리되고 inline함수는 컴파일시에 call 한 부분에 정의된 부분의 코드가 포함되는것으로 알고 있습니다.

익명 사용자의 이미지

define은 전처리기에서 처리하기 때문에.. 심볼테이블에서 제외되므로 디버깅시 곤란할 수 있습니다....

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.