Стандарт C ++ - как обрабатывается «массив неизвестных границ T» - PullRequest
4 голосов
/ 24 сентября 2010

Меня смутило то, что этот код работает:

struct S
{
  char c[];
};
S s;

Согласно стандарту C ++, глава 8.3.4:

"Если константное выражение имеет видопущен, тип идентификатора D - «массив производных-объявлений-типов-списков с неизвестной границей T», неполный тип объекта. »

Но я не могу понять, как« неполный объектТип "становится полным.

Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Вы сказали, что код, который вы разместили, будет компилироваться в VS10.Отключите языковые расширения, и тогда не будет.Проект> Свойства> C / C ++> Язык> Отключить языковые расширения = Да.Это компиляция, потому что вы используете специфичное для MS расширение языка C ++.

Короче говоря, согласно стандарту, ваш код не должен компилироваться.

0 голосов
/ 24 сентября 2010

Кажется, что эта языковая особенность изобретена для того, чтобы позволить инициализировать массив позже в исходном файле.Если я сделаю c нестатичным, то, по крайней мере, в Visual Studio 2010 он не будет скомпилирован, сообщив, что длина c была зафиксирована в 0, а переопределение члена не разрешено.

// header file
struct S
{
    static char c[];
    static size_t len;
};
extern S s;

// source file
char S::c[] = "haha";
size_t S::len = (sizeof(S::c) / sizeof(S::c[0])) - 1;
...