Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual C++ / MFC / WTL > Явное указание членов структуры при build-time-инициализации.


Автор: jcxz 06.08.21, 17:00
Дано:
VS 2017
код:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    struct {
      int member0;
      int member1;
    } static const t = {
      .member0 = 1,
      .member1 = 2
    };

VS почему-то не понимает такую инициализацию и ругается "синтаксической ошибкой" на точки. :(
Хотя вроде не особо допотопный компилятор.
В свойствах проекта перепробовал разные значения для поля "Язык\Стандарт языка C++" - ничего не помогло.
Другие имеющиеся компиляторы нормально такое переваривают. Даже старые.
Может его нужно ещё в какое-то место пнуть, чтоб он прожевал это?

PS: Не знаю как правильно называется такая инициализация, чтобы загуглить это дело...

Автор: Dushevny 06.08.21, 17:08
Это чисто Сишная конструкция. В плюсах ее нет.

Автор: jcxz 06.08.21, 17:21
В смысле нет? У меня другой компилятор (тоже c++) молча её компилит и не морщится.

Добавлено
Впрочем: вынес эту инициализацию в отдельный файл (.c) и скомпилилось.
Спасибо Dushevny за наводку!

PS: Всё-таки жаль, что VC не умеет такое для .cpp-файлов.

Автор: ЫукпШ 06.08.21, 21:50
Цитата jcxz @
PS: Всё-таки жаль, что VC не умеет такое для .cpp-файлов.

А так нельзя ?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        struct {
          int member0;
          int member1;
        } static const t = {2,3};


Или так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    struct XXMM
    {
     int member0;
     int member1;
     XXMM(): member0 (1), member1 (2){}
    };
     
    static const XXMM xxmm1,xxmm2;

Автор: Dushevny 07.08.21, 07:02
Цитата jcxz @
PS: Не знаю как правильно называется такая инициализация, чтобы загуглить это дело...
В стандарте Сей ISO/IEC 9899:1999 она описана в разделе 6.7.8 Initialization. Выглядит это так:
Цитата

Syntax
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation opt initializer
initializer-list , designation opt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
. identifier
....
7 If a designator has the form
. identifier
then the current object (defined below) shall have structure or union type and the
identifier shall be the name of a member of that type.
Как видно, никакого специального имени она не имеет.
В стандарте плюсов такой формы синтаксиса нет (пример из версии 2003 года):
Цитата
8.5 Initializers
initializer:
= initializer-clause
( expression-list )
initializer-clause:
assignment-expression
{ initializer-list , opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause

Автор: jcxz 07.08.21, 09:19
Цитата Dushevny @
А так нельзя ?
Я знаю как это написать. Вопрос был не в этом. Вопрос был конкретный.
Проблема не в написании своего кода, а в компиляции большого объёма чужого, где полно таких инициализаций, причём вложенных на много уровней struct/union. Который нет никакого желания весь перепахивать из-за этого.

Автор: jcxz 07.08.21, 09:26
Цитата jcxz @
В стандарте плюсов такой формы синтаксиса нет (пример из версии 2003 года):

Ещё раз жаль. :( Так как например IAR (for ARM) прекрасно переваривает такие инициализации. Со следующими установками свойств проекта:

Автор: ЫукпШ 07.08.21, 23:52
Цитата jcxz @
Цитата jcxz @
В стандарте плюсов такой формы синтаксиса нет (пример из версии 2003 года):

Ещё раз жаль. :( Так как например IAR (for ARM) прекрасно переваривает такие инициализации.

Значит, тебе крупно не повезло, особенно с наследством.
А у меня IAR для AVR не переваривает такие инициализации.
Зато инициализации вида
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        struct {
          int member0;
          int member1;
        } static const t1 = {1,2};

спокойно перевариваются без любых дополнительных настроек.
-----
Что, интересно, твориться в голове у человека, который в простейшей ситуации
вместо проверенного варианта использует что-то да ещё с дополнительными "птичками" в настройках ? =:0
Полная разруха твориться, теперь придётся весь проект вообще переделывать, и не только
по этой причине.
Не повезло.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)