2013-01-06 2 views
0

우리 모두는이 유명한 매크로 예제를 알고Max 매크로의 안전한 솔루션? 그것은 두 번 <code>a</code> 및 <code>b</code>을 사용하기 때문에 우리가 할 때 부정확하게,</p> <pre><code>#define max(a,b) ((a) > (b) ? (a) : (b)) </code></pre> <p>그리고 뭔가 같은 :

max(x, y++); // because this gets translated to... 
((x) > (y++) ? (x) : (y++)); // y is incremented twice 

효과적인 C++, 스콧에서 Meyers는 inline 함수를 사용하여 C++ 솔루션을 제공합니다.

21st Century C에서 나는 비슷한 C 해결책을 원했지만 슬프게도 이중 사용을 피하는 것이 좋습니다. 그것은 나를 슬프게했다. : '(

물론, 하나는 항상 일정한 기능을 대체 할 수하지만 이중 사용 문제를 해결이로 C 전용 매크로 솔루션은이 있는지 궁금 해서요 가능한 솔루션을

..? 당신의 구호 C로
+1

정확히 왜 하나마다 possib 매크로를 피해야한다 르와 반대가 아닙니다. – dbrank0

+0

당신이 관심이 있다면 여기 [http://www.drdobbs.com/generic-min-and-max-redivivus/184403774]에 대한 C++ 해결책에 대한 흥미로운 기사가 ​​실제로있었습니다. – chris

+0

나는 대답이 없지만 표현을 멈출 수는 없다. 조건에서 증분/감소 연산자를 사용하는 것이 내 것이 아니다. 나는 그것이 인간의 실수에 비해서 우아함이나 편리함보다는 코딩에있어서 더 많은 것을 알았다. –

답변

5

:.

#define max(a,b) \ 
    ({ typeof (a) _a = (a); \ 
     typeof (b) _b = (b); \ 
     _a > _b ? _a : _b; }) 
+0

... typeof (x ++) = (x ++)가 x를 두 번 증가시키지 않습니까? – einpoklum

+0

'typeof' 매개 변수가 평가되지 않습니다. – qrdl

3

는 C99 이후 inline 기능을 가지고이 같은 typeof 확장을 사용할 수 있습니다 GCC의 경우

+0

주인을 칭찬 – ApprenticeHacker

+1

아니, C 표준위원회를 칭찬 해, 그들은 그것을 가치가있다. –

+0

C11은 또한'_Generic'을 추가합니다.이 메소드를 사용하면 인수 유형에 따라 다른 구현 함수에 매크로를 디스패치 할 수 있습니다. ("overloading") – pmdj

관련 문제