#define 문에서 의문점 하나~

gnoygnas의 이미지

커널 소스를 보던중에 의문점이 하나 생겨서요~ ^^

아래와 같이 define문으로 재정의시 구지 한번만 실행시킬 것을 do ~ while로 묶은 이유가 무엇인지 궁금하네요..

#define switch_to(prev, next, last)
         do {
                 last=__switch_to(prev, next);
                 mb();
         } while (0)

:D

관심가져 주셔서 감사합니다..^^

서지훈의 이미지

if (1)
    last=__switch_to(prev, next);
    mb();   ;

if (1)
    do {
        last=__switch_to(prev, next);
        mb();
    } while (0);

이 두개의 차이를 생각해 보시길...

이 질문은... FAQ급이군요 ㅋ
아마 " define and while " 정도로 검색 하시면 많은 글들이 있을듯...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

익명 사용자의 이미지

kldp에서만도 골백번도 더 본 질문이군요.

http://bbs.kldp.org/viewtopic.php?t=45045
http://bbs.kldp.org/viewtopic.php?t=54712

익명 사용자의 이미지

gnoygnas의 이미지

먼저 검색해 보는 걸 잠시 잊었습니다...ㅡ,.ㅡ

우리 모두 검색하는 습관을....안하면 돌 날라 옵니다....ㅎㅎ

암튼 감사합니다..

One must, In fact, Love your pursuit
My home is below...Well, just go own your gait!

lacovnk의 이미지

확 FAQ를 하나 만들면 어떨까요;; ㅎㅎ

익명 사용자의 이미지

그냥

#define A() {...}

이렇게 해두고 실제 expression상에서는 ; 을 붙이지
않는것이 더 편할것 같다는 생각이 드네요.

아마 어디엔 ;을 붙이고..어디엔 안붙이고 하는 일관성 문제때문에
이렇게 하는걸 프로그래머들이 기피하는것 같지만...

저렇게 하면 적어도 do while 문에서의 탈출조건을
한번 체크하는 시간은 벌 수 있기 때문에 성능상 아주 약간은
더 좋을것 같습니다.
(특히 이 구문이 반복적으로 매우 자주 호출된다면 말이죠)

한번만 pass하는 do while구문을 컴파일러가 최적화시켜
일반 블록문으로 대치시키는 경우도 생각해 볼 수 있겠지만..
그 경우라도 괜히 쓸데없는 오버헤드를 컴파일러에게
전가하는것 같아서 찜찜할거 같습니다.

freezm7의 이미지

만사마 wrote:
그냥

#define A() {...}

이렇게 해두고 실제 expression상에서는 ; 을 붙이지
않는것이 더 편할것 같다는 생각이 드네요.

아마 어디엔 ;을 붙이고..어디엔 안붙이고 하는 일관성 문제때문에
이렇게 하는걸 프로그래머들이 기피하는것 같지만...

저렇게 하면 적어도 do while 문에서의 탈출조건을
한번 체크하는 시간은 벌 수 있기 때문에 성능상 아주 약간은
더 좋을것 같습니다.
(특히 이 구문이 반복적으로 매우 자주 호출된다면 말이죠)

한번만 pass하는 do while구문을 컴파일러가 최적화시켜
일반 블록문으로 대치시키는 경우도 생각해 볼 수 있겠지만..
그 경우라도 괜히 쓸데없는 오버헤드를 컴파일러에게
전가하는것 같아서 찜찜할거 같습니다.

컴파일러에게 전가하는 오버헤드보다 사람에게 이건 ; 를 붙이지 말아야 한다고 기억시키는 오버헤드가 훨씬 크지 않을까 싶습니다.

결국 중요한건 사람을 편하게 하는거지 컴파일러를 편하게 하는건 아니니까요.

즐겁게 살아 볼까나~*

익명 사용자의 이미지

freezm7 wrote:
만사마 wrote:
그냥

#define A() {...}

이렇게 해두고 실제 expression상에서는 ; 을 붙이지
않는것이 더 편할것 같다는 생각이 드네요.

아마 어디엔 ;을 붙이고..어디엔 안붙이고 하는 일관성 문제때문에
이렇게 하는걸 프로그래머들이 기피하는것 같지만...

저렇게 하면 적어도 do while 문에서의 탈출조건을
한번 체크하는 시간은 벌 수 있기 때문에 성능상 아주 약간은
더 좋을것 같습니다.
(특히 이 구문이 반복적으로 매우 자주 호출된다면 말이죠)

한번만 pass하는 do while구문을 컴파일러가 최적화시켜
일반 블록문으로 대치시키는 경우도 생각해 볼 수 있겠지만..
그 경우라도 괜히 쓸데없는 오버헤드를 컴파일러에게
전가하는것 같아서 찜찜할거 같습니다.

컴파일러에게 전가하는 오버헤드보다 사람에게 이건 ; 를 붙이지 말아야 한다고 기억시키는 오버헤드가 훨씬 크지 않을까 싶습니다.

결국 중요한건 사람을 편하게 하는거지 컴파일러를 편하게 하는건 아니니까요.

if(cond) A(); 일 경우
if(cond){} ; 이 되고 끝의 ;는 널스테이트먼트가 되지 않나요?

익명 사용자의 이미지

Quote:

이렇게 해두고 실제 expression상에서는 ; 을 붙이지
않는것이 더 편할것 같다는 생각이 드네요.

실제 프로그래밍 짤때 직접 그렇게 해보십시오. 어디 편한가.

Quote:

저렇게 하면 적어도 do while 문에서의 탈출조건을
한번 체크하는 시간은 벌 수 있기 때문에 성능상 아주 약간은
더 좋을것 같습니다.
(특히 이 구문이 반복적으로 매우 자주 호출된다면 말이죠)

컴파일러가 어지간히 바보가 아닌 이상 최적화를 합니다.

Quote:

한번만 pass하는 do while구문을 컴파일러가 최적화시켜
일반 블록문으로 대치시키는 경우도 생각해 볼 수 있겠지만..
그 경우라도 괜히 쓸데없는 오버헤드를 컴파일러에게
전가하는것 같아서 찜찜할거 같습니다.

눈꼽만한 컴파일 시간 증가를 우려하는 것보단 코드의 가독성 저하로 인한 손해를 염려하는 편이 좋습니다.

전웅의 이미지

만사마 wrote:
그냥

#define A() {...}

이렇게 해두고 실제 expression상에서는 ; 을 붙이지
않는것이 더 편할것 같다는 생각이 드네요.

아마 어디엔 ;을 붙이고..어디엔 안붙이고 하는 일관성 문제때문에
이렇게 하는걸 프로그래머들이 기피하는것 같지만...

또 다른 이유로는 사용하는 사람이 매크로인지 실제 함수인지 구분할
필요가 없도록 만들어 주는 것입니다. 실제 함수를 제공하면서 동시에
성능을 위해 masking macro 를 제공하는 경우를 생각해 보시기 바랍니다.

만사마 wrote:
저렇게 하면 적어도 do while 문에서의 탈출조건을
한번 체크하는 시간은 벌 수 있기 때문에 성능상 아주 약간은
더 좋을것 같습니다.

assert() 매크로도 쓰지 말자는 얘기와 같습니다. 무의미한 코드를
생성하는 컴파일러가 잘못된 컴파일러는 아닙니다만, 언어마다 일반적인
프로그래밍 관례가 있고 아무리 최적화를 못하는 컴파일러라 해도 그와
같은 프로그래밍 관례를 수용하는 일은 크게 어렵지 않은 일입니다.

Anonymous wrote:
if(cond) A(); 일 경우
if(cond){} ; 이 되고 끝의 ;는 널스테이트먼트가 되지 않나요?

문제는...

if (cond) A();
else B();

이는 parse error 로 떨어집니다. 이 내용도 위에 언급된 기존 논의
중에 나왔던 것으로 기억합니다.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

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