Подтвердить что ты не робот

Бесполезный спецификатор хранения класса в пустой декларации

gcc 4.4.1 c89

У меня есть следующий код:

static enum states
{
    ACTIVE,
    RUNNING,
    STOPPED,
    IDLE
};

И я получаю предупреждение:

useless class storage specifier in empty declaration

Однако, если я удаляю ключевое слово static, я не получаю это предупреждение.

Я компилирую со следующими флагами:

-Wall -Wextra

Большое спасибо за любые предложения,

4b9b3361

Ответ 1

Вы получаете сообщение, потому что вы фактически не объявляете, вы только определяете что-то, а именно перечисление с именем "states". Вы можете позже использовать это определение, чтобы объявить переменную этого типа. Эта переменная может быть статической или переменной экземпляра, но определение не нуждается (и не должно иметь) спецификатора хранилища, прикрепленного к нему.

Ответ 2

Ваше объявление enum определяет тип, но оно также не объявляет объект этого типа.

static применим только к переменным и функциям, поэтому, как компилятор говорит, он бесполезен в том контексте, в котором он у вас есть.

Ответ 3

Что вы хотите сделать статике? Он служит для предоставления переменных, определенных в внутренней декларации объявления:

static enum states { ... } a;

Как ярлык для

enum states { ... };
static enum states a;

Предоставление "внутренней связи". Но так как вы не определяете переменную в своем коде, она фактически бесполезна (если не незаконна).

Ответ 4

Try:

static enum states
{
    ACTIVE,
    RUNNING,
    STOPPED,
    IDLE
} avar;

который фактически создает статическую переменную avar. Только переменные могут быть статическими, а не типами.