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;

было бы правильно.

Другие вопросы по тегам