Stati c struct предупреждение бесполезный спецификатор класса хранения в пустом объявлении - PullRequest
2 голосов
/ 07 апреля 2020
  static struct astr {
          int a;
  };

  static const struct astr newastr = {
          .a = 9,
  };

Я получаю: предупреждение: бесполезный спецификатор класса хранения в пустом объявлении

Если я изменю его на

  static struct astr {
          int a;
  } something;

, то предупреждение будет исправлено .

Следующее также не дает этого предупреждения

  struct astr {
          int a;
  };

  static const struct astr newastr = {
          .a = 9,
  }; 

Может кто-нибудь объяснить, что здесь происходит?

1 Ответ

4 голосов
/ 07 апреля 2020

Вы получаете предупреждения, когда у вас есть определения структуры без объявления каких-либо переменных. Например, следующее выдаст предупреждение:

static struct s {
    int a;
};

Это эквивалентно:

struct s {
    int a;
};

Это определяет структуру s, но не объявляет никаких переменных. То есть с ним не связано хранилище, поэтому нечего применять static к.

Но если вы сделаете:

static struct s {
    int a;
} x;

Тогда предупреждения нет, потому что вы объявление переменной x в дополнение к определению структуры s, поэтому static применяется к x.

Аналогично, если struct s был ранее определен, вы можете сделать:

static struct s x;

без предупреждения. И, конечно, при желании вы можете при желании поставить инициализатор.

...