2017-11-03 5 views
2

파일 windef.h 다음과 같이 매크로를 사용하여 최소/최대 함수를 정의min/max 함수의 결백 한 매크로 정의가 잘못 되었습니까?

#define max(a,b) ((a)>(b)?(a):(b)) 
#define min(a,b) ((a)<(b)?(a):(b)) 

It has been noted 그러나, 이러한 정의한다 : 이중에서 평가

  1. 겪고있다.
  2. 유형 안전하지 않습니다.

내가 이해하지 못하는 것입니다 :

  1. 왜/어디를 두 번 평가가?
  2. 사소한 재정의 __typeof__ (a) _a = (a); __typeof__ (b) _b = (b);은 유형 안전에 어떤 도움이되며,이 경우 이중 평가가 아닌 이유는 무엇입니까?
+8

가 최대'에 대한 생각의 (a ++, b)는' –

+0

@EugeneSh. 입력하는 값이 (a, b)이지만 (a + 1, b) 직후임을 의미합니까? 유형 안전/이중 평가와 어떤 관련이 있습니까? – Sparkler

+1

'a + 2'가됩니다. 또는'max (printf ("Hi! \ n"), 5);'와 같은 것을 시도해보십시오. –

답변

8

왜/어디에 이중 평가가 있습니까?

이것을 이해하는 가장 쉬운 방법은이 코드를 실행하는 것입니다

#include <stdio.h> 

#define max(a,b) ((a)>(b)?(a):(b)) 

int f1 (void) 
{ 
    printf("%s executed.\n", __func__); 
    return 1; 
} 

int f2 (void) 
{ 
    printf("%s executed.\n", __func__); 
    return 2; 
} 

int main (void) 
{ 
    printf("Max: %d", max(f1(), f2())); 
} 

출력 :

f1 executed. 
f2 executed. 
f2 executed. 
Max: 2 

함수 F2() 매크로 매개 변수 b 평가되기 때문에, 두 번 호출됩니다 두번.


어떻게 사소한 재정 __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); 유형의 안전에 도움이 이유는이 경우에없는 이중 평가입니다합니까?

이 코드는 두 개의 임시 변수를 만들고 거기에 평가 결과를 변수마다 한 번 저장하기 때문에.

({ ... }) 구문은 물론이고 __typeof__은 표준 C가 아니며 피해야합니다. 링크 된 대답에서 매크로는 꽤 못 생겨서 내가 권하는 어떤 것이 아닙니다. 코드가 밝혀 방법 읽을 수

static inline int max (int a, int b) 
{ 
    return a > b ? a : b; 
} 

공지 사항, 매크로 엉망에 비해 :

제정신 솔루션은 매크로하지만 기능을 사용하지 않는 것입니다.

경우 다음과 같이 알 수없는 해야 사용 매크로, 표준 C에 충실 몇 가지 이유 : https://stackoverflow.com/a/30918240/584518

+0

Re : "알 수없는 이유는 매크로를 사용해야합니다.":'int max (int a, int b)'접근법의 알려진 차이점은 매크로 접근 방식이 아닌 'int' 수학을 ​​평가하도록 강요한다는 것입니다. 물론 이것은 주어진 유스 케이스에 중요하거나 중요하지 않을 수도 있으며 매크로가 더 좋음을 의미하지도 않습니다. – chux

+2

@chux 실제로 매크로는'max (apples, oranges)'를 허용합니다. :) – Lundin