Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
А так нельзя ? <{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 |
В стандарте Сей 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 |
Я знаю как это написать. Вопрос был не в этом. Вопрос был конкретный. Проблема не в написании своего кода, а в компиляции большого объёма чужого, где полно таких инициализаций, причём вложенных на много уровней struct/union. Который нет никакого желания весь перепахивать из-за этого. |
Автор: jcxz 07.08.21, 09:26 |
Ещё раз жаль. Так как например IAR (for ARM) прекрасно переваривает такие инициализации. Со следующими установками свойств проекта: |
Автор: ЫукпШ 07.08.21, 23:52 |
Цитата jcxz @ Ещё раз жаль. Так как например IAR (for ARM) прекрасно переваривает такие инициализации. Значит, тебе крупно не повезло, особенно с наследством. А у меня IAR для AVR не переваривает такие инициализации. Зато инициализации вида <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> struct { int member0; int member1; } static const t1 = {1,2}; спокойно перевариваются без любых дополнительных настроек. ----- Что, интересно, твориться в голове у человека, который в простейшей ситуации вместо проверенного варианта использует что-то да ещё с дополнительными "птичками" в настройках ? =:0 Полная разруха твориться, теперь придётся весь проект вообще переделывать, и не только по этой причине. Не повезло. |