C - предварительная декларация перечислений?
Форвардное объявление перечислений в C не работает для меня. Я искал в интернете и stackru, но все вопросы, касающиеся предварительных объявлений перечислителей, относятся к C++. Что вы делаете для объявления перечислителей в C? Разместите их в верхней части каждого файла (или во включении), чтобы все функции в файле могли получить к ним доступ? Спасибо
4 ответа
Поместите их в заголовок, чтобы все файлы, которые в них нуждаются, могли получить доступ к заголовку и использовать объявления из него.
Когда скомпилировано с параметрами:
$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -c enum.c
$
GCC 4.2.1 (в MacOS X 10.7.1) принимает следующий код:
enum xyz;
struct qqq { enum xyz *p; };
enum xyz { abc, def, ghi, jkl };
добавлять -pedantic
и это предупреждает:
$ /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
$
Таким образом, вы не должны пытаться использовать предварительные объявления перечислимых типов в C; GCC допускает это как расширение, когда не вынужден быть педантичным.
Вы не можете "перечислить вперед" перечисления, потому что компилятор не будет знать размер перечисления. Стандарт C говорит: "Каждый перечислимый тип должен быть совместим с char, целочисленным типом со знаком или целочисленным типом без знака. Выбор типа определяется реализацией, но должен быть способен представлять значения всех членов перечисления",
Я пришел сюда с той же ошибкой, но здесь не так много информации о коде / ошибке.
Мои флаги Makefile:
-Wall -Wextra -Werror -pedantic -std=c17
В шапке у меня следующее
enum
:
typedef enum
{
IS_HEAD = 1,
IS_VALUE = 2,
IS_SIDE
} CoinResult;
Рекомендую использовать что-то вроде этого:
enum CoinResult cr;
cr = IS_SIDE;
Это приводит к ошибке, указанной OP.
Решено с помощью:
CoinResult cr = IS_SIDE;
Не уверен, какой C-стандарт, код или эталонный OP использовался, но я частично согласен: большинство руководств и решений для этой относительно простой проблемы довольно неоднозначны.
CoinResult - это не перечисление, это тип. Если у тебя есть
enum CoinResult {
IS_HEAD = 1,
IS_VALUE = 2,
IS_SIDE,
};
тогда
enum CoinResult cr;
было бы правильно.