I have the following code.
typedef enum {FOO, BAR} Baz;
int main()
{
Baz f1 = FOO;
typeof(FOO) f2 = FOO;
return (f1 == f2);
}
My compilation using gcc -Wextra foo.c
generates a warning saying
foo.c: In function ‘main’:
foo.c:7:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
return (f1 == f2);
^
My gcc version
gcc --version
gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
How can I fix this problem?
Quoting directly from C11
, chapter §6.7.2.2
, Enumeration specifiers,
Each enumerated type shall be compatible with
char
, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined.
So, the type of the enum variable is not defined by standard. It can be any of the above.
OTOH, FOO
being an enumeration constant, typeof(FOO)
will give you int
, as the standard mandates
An identifier declared as an enumeration constant has type
int
.
which is being used as the type for f2
.
Now, if enum is unsigned int
on your implementation, so is f1
and, f2
is int
.
Next, you get the warning.
How can I fix this problem?
Well, if you change the type of f2
to typeof(Baz)
, which gives the type of the enum, then both the types of f1
and f2
will be same. Compiler will be happy.
SEE LIVE HERE
It's a known "bug" in the C standard. Enumeration constants are guaranteed to be of type int
, while enumeration variables are of implementation-defined integer type.
See this for references.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With