бесполезный спецификатор хранения класса в пустом объявлении - PullRequest
25 голосов
/ 30 апреля 2010

gcc 4.4.1 c89

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

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

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

useless class storage specifier in empty declaration

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

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

-Wall -Wextra

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

Ответы [ 4 ]

24 голосов
/ 30 апреля 2010

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

13 голосов
/ 30 апреля 2010

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

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

6 голосов
/ 30 апреля 2010

Попробуйте:

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

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

6 голосов
/ 30 апреля 2010

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

static enum states { ... } a;

как ярлык для

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...