Forward declaration of enums in C does not work for me. I searched the internet and stackoverflow but all of the questions regarding forward declarations of enumerators refer to c++. What do you do for declaring enumerators in C? Put them at the top of each file (or in an include) so that all functions in the file can access them? Thanks
Put them in a header so that all files that need them can access the header and use the declarations from it.
When compiled with the options:
$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -c enum.c
$
GCC 4.2.1 (on MacOS X 10.7.1) accepts the following code:
enum xyz;
struct qqq { enum xyz *p; };
enum xyz { abc, def, ghi, jkl };
Add -pedantic
and it warns:
$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -pedantic -c enum.c
enum.c:1: warning: ISO C forbids forward references to ‘enum’ types
enum.c:5: warning: ISO C forbids forward references to ‘enum’ types
$
Thus, you are not supposed to try using forward declarations of enumerated types in C; GCC allows it as an extension when not forced to be pedantic.
You can't "forward-declare" enums because the compiler won't know the size of the enum. The C standard says " Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration ".
I came here having the same error, but there is not really much information provided here on the code/error.
My Makefile-flags are: -Wall -Wextra -Werror -pedantic -std=c17
In my header I have the following enum
:
typedef enum
{
IS_HEAD = 1,
IS_VALUE = 2,
IS_SIDE
} CoinResult;
Would recommend to use something like this:
enum CoinResult cr;
cr = IS_SIDE;
This results in the error stated by the OP.
Solved by using:
CoinResult cr = IS_SIDE;
Not sure which C-Standard, Code or reference OP was using, but I somewhat agree: Most tutorials and solutions for this relatively simple issue are kinda ambiguous.
CoinResult isn't an enum, it's a type. If you had
enum CoinResult {
IS_HEAD = 1,
IS_VALUE = 2,
IS_SIDE,
};
then
enum CoinResult cr;
would be correct.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.