On Wed, Nov 08, 2006 at 11:07:15PM +0100, Ulf Lamping wrote:
> Joerg Mayer wrote:
> > gtkvumeter.c:946: warning: comparison of unsigned expression < 0 is
> > always false
> >
> CLAMP is called with three variables of type GtkVUMeterScaling
> > gtkvumeter.c:1144: warning: comparison of unsigned expression < 0 is
> > always false
> >
> CLAMP is called with three variables of type GtkVUMeterPeakFalloff
>
> Both types are "typedef enum" so I don't understand these warnings.
Since an enum defines the first value 0 and the next 1, look at what the
CLAMP macro from Glib expands into:
Definition:
#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ?
(low) : (x)))
Our use:
vumeter->scaling = CLAMP (scaling, GTK_VUMETER_SCALING_LINEAR,
GTK_VUMETER_SCALING_LOG);
Which turns into:
((scaling) > (1)) ? (1) : (((scaling) < (0)) ? (0) : (scaling)))
An enum is by default "unsigned" since it starts at 0, the macro's check
of < 0 can never be true.
One way that you can fix the warning is by manually assigning numbers to
the enumerated values in gtkvumeter.h:
typedef enum {
GTK_VUMETER_SCALING_LINEAR=1,
GTK_VUMETER_SCALING_LOG=2
} GtkVUMeterScaling;
typedef enum {
GTK_VUMETER_PEAK_FALLOFF_SLOW=1,
GTK_VUMETER_PEAK_FALLOFF_MEDIUM=2,
GTK_VUMETER_PEAK_FALLOFF_FAST=3,
GTK_VUMETER_PEAK_FALLOFF_USER=4
} GtkVUMeterPeakFalloff;
It looks like CLAMP is being used here to just check if the value is
equal to one or the other (it can't be in between since the parameter x
is the same enum).
Steve