max 값을 구하는 매크로가 원하는대로 작동이 안되네요..

superkkt의 이미지

#define MAX(A, B)	((A) > (B)) ? (A) : (B)

maxfp = MAX(sockfd, fileno(fp)) + 1;

위에서 sockfd는 7이고 fileno(fp)는 0의 값을 가지고 들어갑니다. 원하는대로라면 maxfp가 8이되야하는데 계속 7로 나오네요. 매크로가 틀린건가요?

mirr의 이미지

superkkt wrote:
#define MAX(A, B)	((A) > (B)) ? (A) : (B)

maxfp = MAX(sockfd, fileno(fp)) + 1;

위에서 sockfd는 7이고 fileno(fp)는 0의 값을 가지고 들어갑니다. 원하는대로라면 maxfp가 8이되야하는데 계속 7로 나오네요. 매크로가 틀린건가요?


매크로에 괄호를 잘못묶어주셨습니다.
#define MAX(A, B) ((A) > (B)) ? (A) : (B)
이걸
#define MAX(A, B) ((A) > (B) ? (A) : (B))
이렇게 해주셔야 겠지요.
A와 B를 비교하는것을 하나로 묶어버린후 조건연산자를 수행하게 되는겁니다.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

doldori의 이미지

부연하면 연산자의 우선순위 때문에 그렇습니다. 원래의 매크로를 써서 전개하면
maxfp = ((7) > (0)) ? (7) : (0) + 1;
가 됩니다. 의미에 변화를 주지 않는 괄호를 없애고 우선순위를 명확히 나타내면
maxfp = 7 > 0 ? 7 : (0 + 1);
이 되지요. 결과는 당연히 7입니다.
해결책은 위에서 보여주셨군요.

쌀밥의 이미지

superkkt님 요즘 C++ 공부중이신것 아니셨습니까?

C++ 에는 std::max 라는 훌륭한 녀석이 있습니다;;

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

superkkt의 이미지

쌀밥 wrote:
superkkt님 요즘 C++ 공부중이신것 아니셨습니까?

C++ 에는 std::max 라는 훌륭한 녀석이 있습니다;;

아니였습니다. 8) C 공부 중입니다..

======================
BLOG : http://superkkt.com

rainmon의 이미지

답변은 아니고요..
gcc의 옵션중에 전처리문이 적용된 소스를 보는게 있습니다.
그 옵션이 -g 이던가.. 혹시 vc++을 쓰신다해도 그런 옵션을 설정할 수 있는데 /p 던가요.. -_-; 정확히 뭐죠? 아시는분.. -_-;;

doldori의 이미지

rainmon wrote:
답변은 아니고요..
gcc의 옵션중에 전처리문이 적용된 소스를 보는게 있습니다.
그 옵션이 -g 이던가.. 혹시 vc++을 쓰신다해도 그런 옵션을 설정할 수 있는데 /p 던가요.. -_-; 정확히 뭐죠? 아시는분.. -_-;;

gcc는 -E, VC++은 /P입니다. (대문자여야 합니다.)
pynoos의 이미지

rainmon wrote:
답변은 아니고요..
gcc의 옵션중에 전처리문이 적용된 소스를 보는게 있습니다.
그 옵션이 -g 이던가.. 혹시 vc++을 쓰신다해도 그런 옵션을 설정할 수 있는데 /p 던가요.. -_-; 정확히 뭐죠? 아시는분.. -_-;;

전처리 결과를 아시려면 /E 옵션을 넣으시면 됩니다.

ktd2004의 이미지

gcc의 경우에는 -E 옵션으로 알고 있습니다.
그리고 --save-temps 라는 옵션은 중간에 생성되는 모든 파일을 지우지 않고 그대로 남겨두라는 옵션이기때문에 *.i 확장자의 전처리된 파일을 볼 수가 있습니다.

쌀밥의 이미지

메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니다.

C++ 가 아니라고 하시니 직접 만들어서...;;

예를 들어 메크로인 경우 이런 문제가 생기게 됩니다.

앞서와 비슷한 경우인데...

int a = 4;
int b = MAX( a++, 3);

기대하는 b 는 5가 되겠지만, 실제로는 6이 되지요...

이런 문제는 (메크로가 아니라) 함수로 바꾸면 사라집니다.

이런 이유로 C++ 에서 inline 함수가 추가된것이기도 하지요...

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

superkkt의 이미지

쌀밥 wrote:
메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니다.

C++ 가 아니라고 하시니 직접 만들어서...;;

예를 들어 메크로인 경우 이런 문제가 생기게 됩니다.

앞서와 비슷한 경우인데...

int a = 4;
int b = MAX( a++, 3);

기대하는 b 는 5가 되겠지만, 실제로는 6이 되지요...

이런 문제는 (메크로가 아니라) 함수로 바꾸면 사라집니다.

이런 이유로 C++ 에서 inline 함수가 추가된것이기도 하지요...

저기서 기대하는 b가 4가 되어야 하는거 아닌가요? 아~ 메크로 무쟈게 햇갈리는군요..

======================
BLOG : http://superkkt.com

doldori의 이미지

superkkt wrote:
쌀밥 wrote:
메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니다.

C++ 가 아니라고 하시니 직접 만들어서...;;

예를 들어 메크로인 경우 이런 문제가 생기게 됩니다.

앞서와 비슷한 경우인데...

int a = 4;
int b = MAX( a++, 3);

기대하는 b 는 5가 되겠지만, 실제로는 6이 되지요...

이런 문제는 (메크로가 아니라) 함수로 바꾸면 사라집니다.

이런 이유로 C++ 에서 inline 함수가 추가된것이기도 하지요...

저기서 기대하는 b가 4가 되어야 하는거 아닌가요? 아~ 메크로 무쟈게 햇갈리는군요..


헷갈릴 때는 매크로를 전개해서 살펴보면 됩니다. 저 코드를 전개하면
int a = 4; 
int b = (a++ > 3) ? a++ : 3;

삼항 연산자의 조건식 이후(? 지점)에 sequence point가 존재하므로 조건식의
값은 1이고 이때 a의 값은 5가 됩니다. 조건식이 참이므로 a++을 평가하게 되고
따라서 최종적으로 a의 값은 6, b의 값은 5가 됩니다.
지금같은 상황이 매크로의 단점 중 대표적인 예입니다. 부작용(side effect)이 있는
식을 매크로의 인자로 쓰면 의도하지 않은 결과를 얻게 될 수도 있고, 어떤 때는
코드의 결과 자체가 정의되지 않을 수도 있습니다. 뭐, 지금처럼 헷갈릴 수도 있지요. :-)
쌀밥의 이미지

그...그러네요; ++a 로 쓴다는 것이 그만..; ㅋㅋ

하지만 제가 말하는 요점은

메크로는 문제의 소지가 많다는 것인데..... 그점만은 전달하고 싶었습니다.

일하는 사람들의 희망 민주노동당 : http://www.kdlp.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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.