왜/어디에 이중 평가가 있습니까?
이것을 이해하는 가장 쉬운 방법은이 코드를 실행하는 것입니다
#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
가 최대'에 대한 생각의 (a ++, b)는' –
@EugeneSh. 입력하는 값이 (a, b)이지만 (a + 1, b) 직후임을 의미합니까? 유형 안전/이중 평가와 어떤 관련이 있습니까? – Sparkler
'a + 2'가됩니다. 또는'max (printf ("Hi! \ n"), 5);'와 같은 것을 시도해보십시오. –