Почему C++ запрещает анонимные структуры?

Некоторые компиляторы C++ разрешают анонимные объединения и структуры как расширение стандартного C++. Это - немного синтаксического сахара, это иногда очень полезно.

Каково объяснение, которое препятствует тому, чтобы это было частью стандарта? Существует ли технический контрольно-пропускной пункт? Философский? Или просто недостаточно потребности выровнять по ширине его?

Вот образец того, о чем я говорю:

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

Мой компилятор примет это, но он предупреждает, что "неназванная структура/объединение" является нестандартным расширением C++.

87
задан underscore_d 7 December 2017 в 12:18
поделиться

4 ответа

Союзы могут быть анонимными; см. Стандарт, 9.5, параграф 2.

Какую цель вы считаете выполняемой анонимной структурой или классом? Прежде чем размышлять, почему чего-то нет в Стандарте, я хотел бы иметь некоторое представление, почему это должно быть, и я не вижу использования анонимной структуры.

0
ответ дан 24 November 2019 в 07:52
поделиться

Не уверен, что вы имеете в виду. Раздел 9.5 спецификации C++, пункт 2:

Объединение вида

union { member-specification } ;

называется анонимным объединением; оно определяет неназванный объект неназванного типа.

Вы можете делать и такие вещи:

void foo()
{
  typedef
  struct { // unnamed, is that what you mean by anonymous?
    int a;
    char b;
  } MyStructType; // this is more of a "C" style, but valid C++ nonetheless

  struct { // an anonymous struct, not even typedef'd
    double x;
    double y;
  } point = { 1.0, 3.4 };
}

Не всегда очень полезно... хотя иногда полезно в неприятных макроопределениях.

6
ответ дан 24 November 2019 в 07:52
поделиться

На основе правка, комментарии и эта статья MSDN: Анонимные структуры , рискну предположить - это плохо согласуется с концепцией инкапсуляции. Я бы не ожидал, что член класса будет возиться с пространством имен моего класса, кроме простого добавления одного члена. Более того, изменения анонимной структуры могут повлиять на мой класс без разрешения.

0
ответ дан 24 November 2019 в 07:52
поделиться

Ваш код

union {
  struct {
    float x;
    float y;
    float z;
  };
  float v[3];
};

похож на

union Foo {
   int;
   float v[3];
};

который, безусловно, недействителен (в C99 и ранее).

Причина в возможно упрощении разбора (в C), потому что в этом случае вам нужно только проверить, что тело struct/union содержит только "деклараторные утверждения", как

Type field;

Тем не менее, gcc и "другие компиляторы" поддерживают неименованные поля в качестве расширения.

Редактировать: Анонимные структуры теперь официально поддерживаются в C11 (§6.7.2.1/13).

0
ответ дан 24 November 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: