Стандарт ANSI C (он же C89), 3.5.7:
Все выражения в инициализаторе для объекта, имеющего статическое хранилище duration или в списке инициализаторов для объект, который имеет агрегат или объединение тип должен быть константными выражениями .
Последняя часть этого ограничения была удалена в C99, которая не поддерживается должным образом в VS.
в VS 6.0 при компиляции с / W4 я получаю
предупреждение C4204: использовано нестандартное расширение: непостоянный агрегатный инициализатор
, поэтому я думаю, что это не стандартный C, а вы находятся в зависимой от компилятора земле.
Отлично работает на моем G ++ 3.4.4
на Cygwin
.
За исключением ':'
в конце, требующего изменения на ';'
.
И я изменил '__ int64'
на 'long long'
.
С моей более сильной предвзятостью к C для такого кода, я бы написал,
rope z = *(rope *)&a;
, чтобы заставить его включить в компилятор C ++ : -)
.
Но не делайте этого ...
Конечно, как Дэвид отмечает в своем комментарии, правильный путь - это
rope z; z.f = a;