Hannes wrote:
> Geht nicht auch, dass ich ein #define definiere, also "#define name
> text" und im Text dan nur den namen aufrufe und zurückbekomme, ob x in
> den Grenzen liegt?
>
1 | #define IN_RANGE(x,min,max) ((x) < (min) ? 0 : (x) > (max) ? 0 : 1)
|
2 |
|
3 |
|
4 | void foo()
|
5 | {
|
6 | if( IN_RANGE( a, 70, 100 ) )
|
7 | ....
|
Aber ob das klarer ist, ich weiss nicht :-)
Natürlich hätte man den ?: auch vermeiden können ...
1 | #define IN_RANGE(x,min,max) ((min) > (x) && (x) < (max))
|
... aber du wolltest ja kein &&
Wie immer gilt bei Makros: Vorsicht mit der Auswertung. Ein
1 | if( IN_RANGE( a++, 70, 100 ) )
|
geht kräftig in die Hose. Vermeidbar sind die Probleme mit einer
Funktion:
1 | unsigned char InRange( unsigned char Value,
|
2 | unsigned char Min, unsigned char Max )
|
3 | {
|
4 | if( Value < Min )
|
5 | return FALSE;
|
6 |
|
7 | if( Value > Max )
|
8 | return FALSE;
|
9 |
|
10 | return TRUE;
|
11 | }
|
Ein C Profi würde das aber so schreiben:
1 | unsigned char InRange( unsigned char Value,
|
2 | unsigned char Min, unsigned char Max )
|
3 | {
|
4 | return (Value > Min) && ( Value < Max );
|
5 | }
|